/*
 Highcharts JS v5.0.12 (2017-05-24)

 (c) 2009-2016 Torstein Honsi

 License: www.highcharts.com/license
 */
(function (K, S) {
    "object" === typeof module && module.exports ? module.exports = K.document ? S(K) : S : K.Highcharts = S(K)
})("undefined" !== typeof window ? window : this, function (K) {
    K = function () {
        var a = window, C = a.document, A = a.navigator && a.navigator.userAgent || "", G = C && C.createElementNS && !!C.createElementNS("http://www.w3.org/2000/svg", "svg").createSVGRect, F = /(edge|msie|trident)/i.test(A) && !window.opera, m = !G, g = /Firefox/.test(A), k = g && 4 > parseInt(A.split("Firefox/")[1], 10);
        return a.Highcharts ? a.Highcharts.error(16, !0) : {
            product: "Highcharts",
            version: "5.0.12",
            deg2rad: 2 * Math.PI / 360,
            doc: C,
            hasBidiBug: k,
            hasTouch: C && void 0 !== C.documentElement.ontouchstart,
            isMS: F,
            isWebKit: /AppleWebKit/.test(A),
            isFirefox: g,
            isTouchDevice: /(Mobile|Android|Windows Phone)/.test(A),
            SVG_NS: "http://www.w3.org/2000/svg",
            chartCount: 0,
            seriesTypes: {},
            symbolSizes: {},
            svg: G,
            vml: m,
            win: a,
            marginNames: ["plotTop", "marginRight", "marginBottom", "plotLeft"],
            noop: function () {
            },
            charts: []
        }
    }();
    (function (a) {
        var C = [], A = a.charts, G = a.doc, F = a.win;
        a.error = function (m, g) {
            m = a.isNumber(m) ? "Highcharts error #" +
            m + ": www.highcharts.com/errors/" + m : m;
            if (g)throw Error(m);
            F.console && console.log(m)
        };
        a.Fx = function (a, g, k) {
            this.options = g;
            this.elem = a;
            this.prop = k
        };
        a.Fx.prototype = {
            dSetter: function () {
                var a = this.paths[0], g = this.paths[1], k = [], q = this.now, v = a.length, u;
                if (1 === q)k = this.toD; else if (v === g.length && 1 > q)for (; v--;)u = parseFloat(a[v]), k[v] = isNaN(u) ? a[v] : q * parseFloat(g[v] - u) + u; else k = g;
                this.elem.attr("d", k, null, !0)
            }, update: function () {
                var a = this.elem, g = this.prop, k = this.now, q = this.options.step;
                if (this[g + "Setter"])this[g +
                "Setter"](); else a.attr ? a.element && a.attr(g, k, null, !0) : a.style[g] = k + this.unit;
                q && q.call(a, k, this)
            }, run: function (a, g, k) {
                var m = this, v = function (a) {
                    return v.stopped ? !1 : m.step(a)
                }, u;
                this.startTime = +new Date;
                this.start = a;
                this.end = g;
                this.unit = k;
                this.now = this.start;
                this.pos = 0;
                v.elem = this.elem;
                v.prop = this.prop;
                v() && 1 === C.push(v) && (v.timerId = setInterval(function () {
                    for (u = 0; u < C.length; u++)C[u]() || C.splice(u--, 1);
                    C.length || clearInterval(v.timerId)
                }, 13))
            }, step: function (m) {
                var g = +new Date, k, q = this.options, v = this.elem,
                    u = q.complete, h = q.duration, e = q.curAnim;
                v.attr && !v.element ? m = !1 : m || g >= h + this.startTime ? (this.now = this.end, this.pos = 1, this.update(), k = e[this.prop] = !0, a.objectEach(e, function (a) {
                    !0 !== a && (k = !1)
                }), k && u && u.call(v), m = !1) : (this.pos = q.easing((g - this.startTime) / h), this.now = this.start + (this.end - this.start) * this.pos, this.update(), m = !0);
                return m
            }, initPath: function (m, g, k) {
                function q(a) {
                    var b, l;
                    for (y = a.length; y--;)b = "M" === a[y] || "L" === a[y], l = /[a-zA-Z]/.test(a[y + 3]), b && l && a.splice(y + 1, 0, a[y + 1], a[y + 2], a[y + 1], a[y + 2])
                }

                function v(a, b) {
                    for (; a.length < w;) {
                        a[0] = b[w - a.length];
                        var l = a.slice(0, c);
                        [].splice.apply(a, [0, 0].concat(l));
                        D && (l = a.slice(a.length - c), [].splice.apply(a, [a.length, 0].concat(l)), y--)
                    }
                    a[0] = "M"
                }

                function u(a, l) {
                    for (var r = (w - a.length) / c; 0 < r && r--;)b = a.slice().splice(a.length / H - c, c * H), b[0] = l[w - c - r * c], d && (b[c - 6] = b[c - 2], b[c - 5] = b[c - 1]), [].splice.apply(a, [a.length / H, 0].concat(b)), D && r--
                }

                g = g || "";
                var h, e = m.startX, n = m.endX, d = -1 < g.indexOf("C"), c = d ? 7 : 3, w, b, y;
                g = g.split(" ");
                k = k.slice();
                var D = m.isArea, H = D ? 2 : 1, l;
                d && (q(g),
                    q(k));
                if (e && n) {
                    for (y = 0; y < e.length; y++)if (e[y] === n[0]) {
                        h = y;
                        break
                    } else if (e[0] === n[n.length - e.length + y]) {
                        h = y;
                        l = !0;
                        break
                    }
                    void 0 === h && (g = [])
                }
                g.length && a.isNumber(h) && (w = k.length + h * H * c, l ? (v(g, k), u(k, g)) : (v(k, g), u(g, k)));
                return [g, k]
            }
        };
        a.Fx.prototype.fillSetter = a.Fx.prototype.strokeSetter = function () {
            this.elem.attr(this.prop, a.color(this.start).tweenTo(a.color(this.end), this.pos), null, !0)
        };
        a.extend = function (a, g) {
            var m;
            a || (a = {});
            for (m in g)a[m] = g[m];
            return a
        };
        a.merge = function () {
            var m, g = arguments, k, q = {}, v =
                function (g, h) {
                    "object" !== typeof g && (g = {});
                    a.objectEach(h, function (e, n) {
                        !a.isObject(e, !0) || a.isClass(e) || a.isDOMElement(e) ? g[n] = h[n] : g[n] = v(g[n] || {}, e)
                    });
                    return g
                };
            !0 === g[0] && (q = g[1], g = Array.prototype.slice.call(g, 2));
            k = g.length;
            for (m = 0; m < k; m++)q = v(q, g[m]);
            return q
        };
        a.pInt = function (a, g) {
            return parseInt(a, g || 10)
        };
        a.isString = function (a) {
            return "string" === typeof a
        };
        a.isArray = function (a) {
            a = Object.prototype.toString.call(a);
            return "[object Array]" === a || "[object Array Iterator]" === a
        };
        a.isObject = function (m,
                               g) {
            return !!m && "object" === typeof m && (!g || !a.isArray(m))
        };
        a.isDOMElement = function (m) {
            return a.isObject(m) && "number" === typeof m.nodeType
        };
        a.isClass = function (m) {
            var g = m && m.constructor;
            return !(!a.isObject(m, !0) || a.isDOMElement(m) || !g || !g.name || "Object" === g.name)
        };
        a.isNumber = function (a) {
            return "number" === typeof a && !isNaN(a)
        };
        a.erase = function (a, g) {
            for (var m = a.length; m--;)if (a[m] === g) {
                a.splice(m, 1);
                break
            }
        };
        a.defined = function (a) {
            return void 0 !== a && null !== a
        };
        a.attr = function (m, g, k) {
            var q;
            a.isString(g) ? a.defined(k) ?
                m.setAttribute(g, k) : m && m.getAttribute && (q = m.getAttribute(g)) : a.defined(g) && a.isObject(g) && a.objectEach(g, function (a, g) {
                m.setAttribute(g, a)
            });
            return q
        };
        a.splat = function (m) {
            return a.isArray(m) ? m : [m]
        };
        a.syncTimeout = function (a, g, k) {
            if (g)return setTimeout(a, g, k);
            a.call(0, k)
        };
        a.pick = function () {
            var a = arguments, g, k, q = a.length;
            for (g = 0; g < q; g++)if (k = a[g], void 0 !== k && null !== k)return k
        };
        a.css = function (m, g) {
            a.isMS && !a.svg && g && void 0 !== g.opacity && (g.filter = "alpha(opacity\x3d" + 100 * g.opacity + ")");
            a.extend(m.style,
                g)
        };
        a.createElement = function (m, g, k, q, v) {
            m = G.createElement(m);
            var u = a.css;
            g && a.extend(m, g);
            v && u(m, {padding: 0, border: "none", margin: 0});
            k && u(m, k);
            q && q.appendChild(m);
            return m
        };
        a.extendClass = function (m, g) {
            var k = function () {
            };
            k.prototype = new m;
            a.extend(k.prototype, g);
            return k
        };
        a.pad = function (a, g, k) {
            return Array((g || 2) + 1 - String(a).length).join(k || 0) + a
        };
        a.relativeLength = function (a, g) {
            return /%$/.test(a) ? g * parseFloat(a) / 100 : parseFloat(a)
        };
        a.wrap = function (a, g, k) {
            var q = a[g];
            a[g] = function () {
                var a = Array.prototype.slice.call(arguments),
                    g = arguments, h = this;
                h.proceed = function () {
                    q.apply(h, arguments.length ? arguments : g)
                };
                a.unshift(q);
                a = k.apply(this, a);
                h.proceed = null;
                return a
            }
        };
        a.getTZOffset = function (m) {
            var g = a.Date;
            return 6E4 * (g.hcGetTimezoneOffset && g.hcGetTimezoneOffset(m) || g.hcTimezoneOffset || 0)
        };
        a.dateFormat = function (m, g, k) {
            if (!a.defined(g) || isNaN(g))return a.defaultOptions.lang.invalidDate || "";
            m = a.pick(m, "%Y-%m-%d %H:%M:%S");
            var q = a.Date, v = new q(g - a.getTZOffset(g)), u = v[q.hcGetHours](), h = v[q.hcGetDay](), e = v[q.hcGetDate](), n = v[q.hcGetMonth](),
                d = v[q.hcGetFullYear](), c = a.defaultOptions.lang, w = c.weekdays, b = c.shortWeekdays, y = a.pad, q = a.extend({
                    a: b ? b[h] : w[h].substr(0, 3),
                    A: w[h],
                    d: y(e),
                    e: y(e, 2, " "),
                    w: h,
                    b: c.shortMonths[n],
                    B: c.months[n],
                    m: y(n + 1),
                    y: d.toString().substr(2, 2),
                    Y: d,
                    H: y(u),
                    k: u,
                    I: y(u % 12 || 12),
                    l: u % 12 || 12,
                    M: y(v[q.hcGetMinutes]()),
                    p: 12 > u ? "AM" : "PM",
                    P: 12 > u ? "am" : "pm",
                    S: y(v.getSeconds()),
                    L: y(Math.round(g % 1E3), 3)
                }, a.dateFormats);
            a.objectEach(q, function (a, b) {
                for (; -1 !== m.indexOf("%" + b);)m = m.replace("%" + b, "function" === typeof a ? a(g) : a)
            });
            return k ? m.substr(0,
                1).toUpperCase() + m.substr(1) : m
        };
        a.formatSingle = function (m, g) {
            var k = /\.([0-9])/, q = a.defaultOptions.lang;
            /f$/.test(m) ? (k = (k = m.match(k)) ? k[1] : -1, null !== g && (g = a.numberFormat(g, k, q.decimalPoint, -1 < m.indexOf(",") ? q.thousandsSep : ""))) : g = a.dateFormat(m, g);
            return g
        };
        a.format = function (m, g) {
            for (var k = "{", q = !1, v, u, h, e, n = [], d; m;) {
                k = m.indexOf(k);
                if (-1 === k)break;
                v = m.slice(0, k);
                if (q) {
                    v = v.split(":");
                    u = v.shift().split(".");
                    e = u.length;
                    d = g;
                    for (h = 0; h < e; h++)d = d[u[h]];
                    v.length && (d = a.formatSingle(v.join(":"), d));
                    n.push(d)
                } else n.push(v);
                m = m.slice(k + 1);
                k = (q = !q) ? "}" : "{"
            }
            n.push(m);
            return n.join("")
        };
        a.getMagnitude = function (a) {
            return Math.pow(10, Math.floor(Math.log(a) / Math.LN10))
        };
        a.normalizeTickInterval = function (m, g, k, q, v) {
            var u, h = m;
            k = a.pick(k, 1);
            u = m / k;
            g || (g = v ? [1, 1.2, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10] : [1, 2, 2.5, 5, 10], !1 === q && (1 === k ? g = a.grep(g, function (a) {
                return 0 === a % 1
            }) : .1 >= k && (g = [1 / k])));
            for (q = 0; q < g.length && !(h = g[q], v && h * k >= m || !v && u <= (g[q] + (g[q + 1] || g[q])) / 2); q++);
            return h = a.correctFloat(h * k, -Math.round(Math.log(.001) / Math.LN10))
        };
        a.stableSort =
            function (a, g) {
                var k = a.length, q, m;
                for (m = 0; m < k; m++)a[m].safeI = m;
                a.sort(function (a, h) {
                    q = g(a, h);
                    return 0 === q ? a.safeI - h.safeI : q
                });
                for (m = 0; m < k; m++)delete a[m].safeI
            };
        a.arrayMin = function (a) {
            for (var g = a.length, k = a[0]; g--;)a[g] < k && (k = a[g]);
            return k
        };
        a.arrayMax = function (a) {
            for (var g = a.length, k = a[0]; g--;)a[g] > k && (k = a[g]);
            return k
        };
        a.destroyObjectProperties = function (m, g) {
            a.objectEach(m, function (a, q) {
                a && a !== g && a.destroy && a.destroy();
                delete m[q]
            })
        };
        a.discardElement = function (m) {
            var g = a.garbageBin;
            g || (g = a.createElement("div"));
            m && g.appendChild(m);
            g.innerHTML = ""
        };
        a.correctFloat = function (a, g) {
            return parseFloat(a.toPrecision(g || 14))
        };
        a.setAnimation = function (m, g) {
            g.renderer.globalAnimation = a.pick(m, g.options.chart.animation, !0)
        };
        a.animObject = function (m) {
            return a.isObject(m) ? a.merge(m) : {duration: m ? 500 : 0}
        };
        a.timeUnits = {
            millisecond: 1,
            second: 1E3,
            minute: 6E4,
            hour: 36E5,
            day: 864E5,
            week: 6048E5,
            month: 24192E5,
            year: 314496E5
        };
        a.numberFormat = function (m, g, k, q) {
            m = +m || 0;
            g = +g;
            var v = a.defaultOptions.lang, u = (m.toString().split(".")[1] || "").length,
                h, e;
            -1 === g ? g = Math.min(u, 20) : a.isNumber(g) || (g = 2);
            e = (Math.abs(m) + Math.pow(10, -Math.max(g, u) - 1)).toFixed(g);
            u = String(a.pInt(e));
            h = 3 < u.length ? u.length % 3 : 0;
            k = a.pick(k, v.decimalPoint);
            q = a.pick(q, v.thousandsSep);
            m = (0 > m ? "-" : "") + (h ? u.substr(0, h) + q : "");
            m += u.substr(h).replace(/(\d{3})(?=\d)/g, "$1" + q);
            g && (m += k + e.slice(-g));
            return m
        };
        Math.easeInOutSine = function (a) {
            return -.5 * (Math.cos(Math.PI * a) - 1)
        };
        a.getStyle = function (m, g, k) {
            if ("width" === g)return Math.min(m.offsetWidth, m.scrollWidth) - a.getStyle(m, "padding-left") -
                a.getStyle(m, "padding-right");
            if ("height" === g)return Math.min(m.offsetHeight, m.scrollHeight) - a.getStyle(m, "padding-top") - a.getStyle(m, "padding-bottom");
            if (m = F.getComputedStyle(m, void 0))m = m.getPropertyValue(g), a.pick(k, !0) && (m = a.pInt(m));
            return m
        };
        a.inArray = function (a, g) {
            return g.indexOf ? g.indexOf(a) : [].indexOf.call(g, a)
        };
        a.grep = function (a, g) {
            return [].filter.call(a, g)
        };
        a.find = function (a, g) {
            return [].find.call(a, g)
        };
        a.map = function (a, g) {
            for (var k = [], q = 0, m = a.length; q < m; q++)k[q] = g.call(a[q], a[q], q, a);
            return k
        };
        a.offset = function (a) {
            var g = G.documentElement;
            a = a.getBoundingClientRect();
            return {
                top: a.top + (F.pageYOffset || g.scrollTop) - (g.clientTop || 0),
                left: a.left + (F.pageXOffset || g.scrollLeft) - (g.clientLeft || 0)
            }
        };
        a.stop = function (a, g) {
            for (var k = C.length; k--;)C[k].elem !== a || g && g !== C[k].prop || (C[k].stopped = !0)
        };
        a.each = function (a, g, k) {
            return Array.prototype.forEach.call(a, g, k)
        };
        a.objectEach = function (a, g, k) {
            for (var q in a)a.hasOwnProperty(q) && g.call(k, a[q], q, a)
        };
        a.addEvent = function (m, g, k) {
            function q(a) {
                a.target =
                    a.srcElement || F;
                k.call(m, a)
            }

            var v = m.hcEvents = m.hcEvents || {};
            m.addEventListener ? m.addEventListener(g, k, !1) : m.attachEvent && (m.hcEventsIE || (m.hcEventsIE = {}), m.hcEventsIE[k.toString()] = q, m.attachEvent("on" + g, q));
            v[g] || (v[g] = []);
            v[g].push(k);
            return function () {
                a.removeEvent(m, g, k)
            }
        };
        a.removeEvent = function (m, g, k) {
            function q(a, d) {
                m.removeEventListener ? m.removeEventListener(a, d, !1) : m.attachEvent && (d = m.hcEventsIE[d.toString()], m.detachEvent("on" + a, d))
            }

            function v() {
                var e, d;
                m.nodeName && (g ? (e = {}, e[g] = !0) : e = h,
                    a.objectEach(e, function (a, e) {
                        if (h[e])for (d = h[e].length; d--;)q(e, h[e][d])
                    }))
            }

            var u, h = m.hcEvents, e;
            h && (g ? (u = h[g] || [], k ? (e = a.inArray(k, u), -1 < e && (u.splice(e, 1), h[g] = u), q(g, k)) : (v(), h[g] = [])) : (v(), m.hcEvents = {}))
        };
        a.fireEvent = function (m, g, k, q) {
            var v;
            v = m.hcEvents;
            var u, h;
            k = k || {};
            if (G.createEvent && (m.dispatchEvent || m.fireEvent))v = G.createEvent("Events"), v.initEvent(g, !0, !0), a.extend(v, k), m.dispatchEvent ? m.dispatchEvent(v) : m.fireEvent(g, v); else if (v)for (v = v[g] || [], u = v.length, k.target || a.extend(k, {
                preventDefault: function () {
                    k.defaultPrevented = !0
                }, target: m, type: g
            }), g = 0; g < u; g++)(h = v[g]) && !1 === h.call(m, k) && k.preventDefault();
            q && !k.defaultPrevented && q(k)
        };
        a.animate = function (m, g, k) {
            var q, v = "", u, h, e;
            a.isObject(k) || (e = arguments, k = {duration: e[2], easing: e[3], complete: e[4]});
            a.isNumber(k.duration) || (k.duration = 400);
            k.easing = "function" === typeof k.easing ? k.easing : Math[k.easing] || Math.easeInOutSine;
            k.curAnim = a.merge(g);
            a.objectEach(g, function (e, d) {
                a.stop(m, d);
                h = new a.Fx(m, k, d);
                u = null;
                "d" === d ? (h.paths = h.initPath(m, m.d, g.d), h.toD = g.d, q = 0, u = 1) : m.attr ?
                    q = m.attr(d) : (q = parseFloat(a.getStyle(m, d)) || 0, "opacity" !== d && (v = "px"));
                u || (u = e);
                u && u.match && u.match("px") && (u = u.replace(/px/g, ""));
                h.run(q, u, v)
            })
        };
        a.seriesType = function (m, g, k, q, v) {
            var u = a.getOptions(), h = a.seriesTypes;
            if (h[m])return a.error(27);
            u.plotOptions[m] = a.merge(u.plotOptions[g], k);
            h[m] = a.extendClass(h[g] || function () {
                }, q);
            h[m].prototype.type = m;
            v && (h[m].prototype.pointClass = a.extendClass(a.Point, v));
            return h[m]
        };
        a.uniqueKey = function () {
            var a = Math.random().toString(36).substring(2, 9), g = 0;
            return function () {
                return "highcharts-" +
                    a + "-" + g++
            }
        }();
        F.jQuery && (F.jQuery.fn.highcharts = function () {
            var m = [].slice.call(arguments);
            if (this[0])return m[0] ? (new (a[a.isString(m[0]) ? m.shift() : "Chart"])(this[0], m[0], m[1]), this) : A[a.attr(this[0], "data-highcharts-chart")]
        });
        G && !G.defaultView && (a.getStyle = function (m, g) {
            var k = {width: "clientWidth", height: "clientHeight"}[g];
            if (m.style[g])return a.pInt(m.style[g]);
            "opacity" === g && (g = "filter");
            if (k)return m.style.zoom = 1, Math.max(m[k] - 2 * a.getStyle(m, "padding"), 0);
            m = m.currentStyle[g.replace(/\-(\w)/g,
                function (a, g) {
                    return g.toUpperCase()
                })];
            "filter" === g && (m = m.replace(/alpha\(opacity=([0-9]+)\)/, function (a, g) {
                return g / 100
            }));
            return "" === m ? 1 : a.pInt(m)
        });
        Array.prototype.forEach || (a.each = function (a, g, k) {
            for (var q = 0, m = a.length; q < m; q++)if (!1 === g.call(k, a[q], q, a))return q
        });
        Array.prototype.indexOf || (a.inArray = function (a, g) {
            var k, q = 0;
            if (g)for (k = g.length; q < k; q++)if (g[q] === a)return q;
            return -1
        });
        Array.prototype.filter || (a.grep = function (a, g) {
            for (var k = [], q = 0, m = a.length; q < m; q++)g(a[q], q) && k.push(a[q]);
            return k
        });
        Array.prototype.find || (a.find = function (a, g) {
            var k, q = a.length;
            for (k = 0; k < q; k++)if (g(a[k], k))return a[k]
        })
    })(K);
    (function (a) {
        var C = a.each, A = a.isNumber, G = a.map, F = a.merge, m = a.pInt;
        a.Color = function (g) {
            if (!(this instanceof a.Color))return new a.Color(g);
            this.init(g)
        };
        a.Color.prototype = {
            parsers: [{
                regex: /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,
                parse: function (a) {
                    return [m(a[1]), m(a[2]), m(a[3]), parseFloat(a[4], 10)]
                }
            }, {
                regex: /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,
                parse: function (a) {
                    return [m(a[1]), m(a[2]), m(a[3]), 1]
                }
            }], names: {none: "rgba(255,255,255,0)", white: "#ffffff", black: "#000000"}, init: function (g) {
                var k, q, m, u;
                if ((this.input = g = this.names[g && g.toLowerCase ? g.toLowerCase() : ""] || g) && g.stops)this.stops = G(g.stops, function (h) {
                    return new a.Color(h[1])
                }); else if (g && "#" === g[0] && (k = g.length, g = parseInt(g.substr(1), 16), 7 === k ? q = [(g & 16711680) >> 16, (g & 65280) >> 8, g & 255, 1] : 4 === k && (q = [(g & 3840) >> 4 | (g & 3840) >> 8, (g & 240) >> 4 | g & 240, (g & 15) << 4 | g & 15, 1])), !q)for (m = this.parsers.length; m-- && !q;)u = this.parsers[m], (k = u.regex.exec(g)) && (q = u.parse(k));
                this.rgba = q || []
            }, get: function (a) {
                var g = this.input, q = this.rgba, m;
                this.stops ? (m = F(g), m.stops = [].concat(m.stops), C(this.stops, function (g, h) {
                    m.stops[h] = [m.stops[h][0], g.get(a)]
                })) : m = q && A(q[0]) ? "rgb" === a || !a && 1 === q[3] ? "rgb(" + q[0] + "," + q[1] + "," + q[2] + ")" : "a" === a ? q[3] : "rgba(" + q.join(",") + ")" : g;
                return m
            }, brighten: function (a) {
                var g, q = this.rgba;
                if (this.stops)C(this.stops, function (g) {
                    g.brighten(a)
                }); else if (A(a) && 0 !== a)for (g = 0; 3 > g; g++)q[g] += m(255 * a), 0 >
                q[g] && (q[g] = 0), 255 < q[g] && (q[g] = 255);
                return this
            }, setOpacity: function (a) {
                this.rgba[3] = a;
                return this
            }, tweenTo: function (a, k) {
                var g, m;
                a.rgba.length ? (g = this.rgba, a = a.rgba, m = 1 !== a[3] || 1 !== g[3], a = (m ? "rgba(" : "rgb(") + Math.round(a[0] + (g[0] - a[0]) * (1 - k)) + "," + Math.round(a[1] + (g[1] - a[1]) * (1 - k)) + "," + Math.round(a[2] + (g[2] - a[2]) * (1 - k)) + (m ? "," + (a[3] + (g[3] - a[3]) * (1 - k)) : "") + ")") : a = a.input || "none";
                return a
            }
        };
        a.color = function (g) {
            return new a.Color(g)
        }
    })(K);
    (function (a) {
        var C, A, G = a.addEvent, F = a.animate, m = a.attr, g = a.charts,
            k = a.color, q = a.css, v = a.createElement, u = a.defined, h = a.deg2rad, e = a.destroyObjectProperties, n = a.doc, d = a.each, c = a.extend, w = a.erase, b = a.grep, y = a.hasTouch, D = a.inArray, H = a.isArray, l = a.isFirefox, B = a.isMS, r = a.isObject, z = a.isString, M = a.isWebKit, p = a.merge, E = a.noop, I = a.objectEach, L = a.pick, f = a.pInt, t = a.removeEvent, R = a.stop, J = a.svg, N = a.SVG_NS, O = a.symbolSizes, P = a.win;
        C = a.SVGElement = function () {
            return this
        };
        c(C.prototype, {
            opacity: 1,
            SVG_NS: N,
            textProps: "direction fontSize fontWeight fontFamily fontStyle color lineHeight width textAlign textDecoration textOverflow textOutline".split(" "),
            init: function (a, f) {
                this.element = "span" === f ? v(f) : n.createElementNS(this.SVG_NS, f);
                this.renderer = a
            },
            animate: function (x, f, t) {
                f = a.animObject(L(f, this.renderer.globalAnimation, !0));
                0 !== f.duration ? (t && (f.complete = t), F(this, x, f)) : (this.attr(x, null, t), f.step && f.step.call(this));
                return this
            },
            colorGradient: function (x, f, t) {
                var b = this.renderer, l, c, r, Q, e, h, n, y, E, w, J = [], B;
                x.radialGradient ? c = "radialGradient" : x.linearGradient && (c = "linearGradient");
                c && (r = x[c], e = b.gradients, n = x.stops, w = t.radialReference, H(r) && (x[c] =
                    r = {
                        x1: r[0],
                        y1: r[1],
                        x2: r[2],
                        y2: r[3],
                        gradientUnits: "userSpaceOnUse"
                    }), "radialGradient" === c && w && !u(r.gradientUnits) && (Q = r, r = p(r, b.getRadialAttr(w, Q), {gradientUnits: "userSpaceOnUse"})), I(r, function (a, x) {
                    "id" !== x && J.push(x, a)
                }), I(n, function (a) {
                    J.push(a)
                }), J = J.join(","), e[J] ? w = e[J].attr("id") : (r.id = w = a.uniqueKey(), e[J] = h = b.createElement(c).attr(r).add(b.defs), h.radAttr = Q, h.stops = [], d(n, function (x) {
                    0 === x[1].indexOf("rgba") ? (l = a.color(x[1]), y = l.get("rgb"), E = l.get("a")) : (y = x[1], E = 1);
                    x = b.createElement("stop").attr({
                        offset: x[0],
                        "stop-color": y, "stop-opacity": E
                    }).add(h);
                    h.stops.push(x)
                })), B = "url(" + b.url + "#" + w + ")", t.setAttribute(f, B), t.gradient = J, x.toString = function () {
                    return B
                })
            },
            applyTextOutline: function (x) {
                var f = this.element, t, b, l, c, r;
                -1 !== x.indexOf("contrast") && (x = x.replace(/contrast/g, this.renderer.getContrast(f.style.fill)));
                x = x.split(" ");
                b = x[x.length - 1];
                if ((l = x[0]) && "none" !== l && a.svg) {
                    this.fakeTS = !0;
                    x = [].slice.call(f.getElementsByTagName("tspan"));
                    this.ySetter = this.xSetter;
                    l = l.replace(/(^[\d\.]+)(.*?)$/g, function (a,
                                                                 x, f) {
                        return 2 * x + f
                    });
                    for (r = x.length; r--;)t = x[r], "highcharts-text-outline" === t.getAttribute("class") && w(x, f.removeChild(t));
                    c = f.firstChild;
                    d(x, function (a, x) {
                        0 === x && (a.setAttribute("x", f.getAttribute("x")), x = f.getAttribute("y"), a.setAttribute("y", x || 0), null === x && f.setAttribute("y", 0));
                        a = a.cloneNode(1);
                        m(a, {
                            "class": "highcharts-text-outline",
                            fill: b,
                            stroke: b,
                            "stroke-width": l,
                            "stroke-linejoin": "round"
                        });
                        f.insertBefore(a, c)
                    })
                }
            },
            attr: function (a, f, t, b) {
                var x, l = this.element, c, r = this, d, p;
                "string" === typeof a &&
                void 0 !== f && (x = a, a = {}, a[x] = f);
                "string" === typeof a ? r = (this[a + "Getter"] || this._defaultGetter).call(this, a, l) : (I(a, function (x, f) {
                    d = !1;
                    b || R(this, f);
                    this.symbolName && /^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)$/.test(f) && (c || (this.symbolAttr(a), c = !0), d = !0);
                    !this.rotation || "x" !== f && "y" !== f || (this.doTransform = !0);
                    d || (p = this[f + "Setter"] || this._defaultSetter, p.call(this, x, f, l), this.shadows && /^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(f) && this.updateShadows(f, x, p))
                }, this), this.afterSetters());
                t && t();
                return r
            },
            afterSetters: function () {
                this.doTransform && (this.updateTransform(), this.doTransform = !1)
            },
            updateShadows: function (a, f, t) {
                for (var x = this.shadows, b = x.length; b--;)t.call(x[b], "height" === a ? Math.max(f - (x[b].cutHeight || 0), 0) : "d" === a ? this.d : f, a, x[b])
            },
            addClass: function (a, f) {
                var x = this.attr("class") || "";
                -1 === x.indexOf(a) && (f || (a = (x + (x ? " " : "") + a).replace("  ", " ")), this.attr("class", a));
                return this
            },
            hasClass: function (a) {
                return -1 !== m(this.element, "class").indexOf(a)
            },
            removeClass: function (a) {
                m(this.element,
                    "class", (m(this.element, "class") || "").replace(a, ""));
                return this
            },
            symbolAttr: function (a) {
                var x = this;
                d("x y r start end width height innerR anchorX anchorY".split(" "), function (f) {
                    x[f] = L(a[f], x[f])
                });
                x.attr({d: x.renderer.symbols[x.symbolName](x.x, x.y, x.width, x.height, x)})
            },
            clip: function (a) {
                return this.attr("clip-path", a ? "url(" + this.renderer.url + "#" + a.id + ")" : "none")
            },
            crisp: function (a, f) {
                var x = this, t = {}, b;
                f = f || a.strokeWidth || 0;
                b = Math.round(f) % 2 / 2;
                a.x = Math.floor(a.x || x.x || 0) + b;
                a.y = Math.floor(a.y || x.y ||
                        0) + b;
                a.width = Math.floor((a.width || x.width || 0) - 2 * b);
                a.height = Math.floor((a.height || x.height || 0) - 2 * b);
                u(a.strokeWidth) && (a.strokeWidth = f);
                I(a, function (a, f) {
                    x[f] !== a && (x[f] = t[f] = a)
                });
                return t
            },
            css: function (a) {
                var x = this.styles, t = {}, b = this.element, l, r = "", d, p = !x, e = ["textOutline", "textOverflow", "width"];
                a && a.color && (a.fill = a.color);
                x && I(a, function (a, f) {
                    a !== x[f] && (t[f] = a, p = !0)
                });
                p && (x && (a = c(x, t)), l = this.textWidth = a && a.width && "auto" !== a.width && "text" === b.nodeName.toLowerCase() && f(a.width), this.styles = a, l && !J && this.renderer.forExport && delete a.width, B && !J ? q(this.element, a) : (d = function (a, x) {
                    return "-" + x.toLowerCase()
                }, I(a, function (a, x) {
                    -1 === D(x, e) && (r += x.replace(/([A-Z])/g, d) + ":" + a + ";")
                }), r && m(b, "style", r)), this.added && ("text" === this.element.nodeName && this.renderer.buildText(this), a && a.textOutline && this.applyTextOutline(a.textOutline)));
                return this
            },
            strokeWidth: function () {
                return this["stroke-width"] || 0
            },
            on: function (a, f) {
                var x = this, t = x.element;
                y && "click" === a ? (t.ontouchstart = function (a) {
                    x.touchEventFired =
                        Date.now();
                    a.preventDefault();
                    f.call(t, a)
                }, t.onclick = function (a) {
                    (-1 === P.navigator.userAgent.indexOf("Android") || 1100 < Date.now() - (x.touchEventFired || 0)) && f.call(t, a)
                }) : t["on" + a] = f;
                return this
            },
            setRadialReference: function (a) {
                var x = this.renderer.gradients[this.element.gradient];
                this.element.radialReference = a;
                x && x.radAttr && x.animate(this.renderer.getRadialAttr(a, x.radAttr));
                return this
            },
            translate: function (a, f) {
                return this.attr({translateX: a, translateY: f})
            },
            invert: function (a) {
                this.inverted = a;
                this.updateTransform();
                return this
            },
            updateTransform: function () {
                var a = this.translateX || 0, f = this.translateY || 0, t = this.scaleX, b = this.scaleY, l = this.inverted, c = this.rotation, r = this.element;
                l && (a += this.width, f += this.height);
                a = ["translate(" + a + "," + f + ")"];
                l ? a.push("rotate(90) scale(-1,1)") : c && a.push("rotate(" + c + " " + (r.getAttribute("x") || 0) + " " + (r.getAttribute("y") || 0) + ")");
                (u(t) || u(b)) && a.push("scale(" + L(t, 1) + " " + L(b, 1) + ")");
                a.length && r.setAttribute("transform", a.join(" "))
            },
            toFront: function () {
                var a = this.element;
                a.parentNode.appendChild(a);
                return this
            },
            align: function (a, f, t) {
                var x, b, l, c, r = {};
                b = this.renderer;
                l = b.alignedObjects;
                var d, p;
                if (a) {
                    if (this.alignOptions = a, this.alignByTranslate = f, !t || z(t))this.alignTo = x = t || "renderer", w(l, this), l.push(this), t = null
                } else a = this.alignOptions, f = this.alignByTranslate, x = this.alignTo;
                t = L(t, b[x], b);
                x = a.align;
                b = a.verticalAlign;
                l = (t.x || 0) + (a.x || 0);
                c = (t.y || 0) + (a.y || 0);
                "right" === x ? d = 1 : "center" === x && (d = 2);
                d && (l += (t.width - (a.width || 0)) / d);
                r[f ? "translateX" : "x"] = Math.round(l);
                "bottom" === b ? p = 1 : "middle" === b && (p =
                    2);
                p && (c += (t.height - (a.height || 0)) / p);
                r[f ? "translateY" : "y"] = Math.round(c);
                this[this.placed ? "animate" : "attr"](r);
                this.placed = !0;
                this.alignAttr = r;
                return this
            },
            getBBox: function (a, f) {
                var x, t = this.renderer, b, l = this.element, r = this.styles, p, e = this.textStr, n, Q = t.cache, y = t.cacheKeys, E;
                f = L(f, this.rotation);
                b = f * h;
                p = r && r.fontSize;
                void 0 !== e && (E = e.toString(), -1 === E.indexOf("\x3c") && (E = E.replace(/[0-9]/g, "0")), E += ["", f || 0, p, r && r.width, r && r.textOverflow].join());
                E && !a && (x = Q[E]);
                if (!x) {
                    if (l.namespaceURI === this.SVG_NS ||
                        t.forExport) {
                        try {
                            (n = this.fakeTS && function (a) {
                                    d(l.querySelectorAll(".highcharts-text-outline"), function (x) {
                                        x.style.display = a
                                    })
                                }) && n("none"), x = l.getBBox ? c({}, l.getBBox()) : {
                                width: l.offsetWidth,
                                height: l.offsetHeight
                            }, n && n("")
                        } catch (X) {
                        }
                        if (!x || 0 > x.width)x = {width: 0, height: 0}
                    } else x = this.htmlGetBBox();
                    t.isSVG && (a = x.width, t = x.height, r && "11px" === r.fontSize && 17 === Math.round(t) && (x.height = t = 14), f && (x.width = Math.abs(t * Math.sin(b)) + Math.abs(a * Math.cos(b)), x.height = Math.abs(t * Math.cos(b)) + Math.abs(a * Math.sin(b))));
                    if (E && 0 < x.height) {
                        for (; 250 < y.length;)delete Q[y.shift()];
                        Q[E] || y.push(E);
                        Q[E] = x
                    }
                }
                return x
            },
            show: function (a) {
                return this.attr({visibility: a ? "inherit" : "visible"})
            },
            hide: function () {
                return this.attr({visibility: "hidden"})
            },
            fadeOut: function (a) {
                var x = this;
                x.animate({opacity: 0}, {
                    duration: a || 150, complete: function () {
                        x.attr({y: -9999})
                    }
                })
            },
            add: function (a) {
                var x = this.renderer, f = this.element, t;
                a && (this.parentGroup = a);
                this.parentInverted = a && a.inverted;
                void 0 !== this.textStr && x.buildText(this);
                this.added = !0;
                if (!a ||
                    a.handleZ || this.zIndex)t = this.zIndexSetter();
                t || (a ? a.element : x.box).appendChild(f);
                if (this.onAdd)this.onAdd();
                return this
            },
            safeRemoveChild: function (a) {
                var x = a.parentNode;
                x && x.removeChild(a)
            },
            destroy: function () {
                var a = this, f = a.element || {}, t = a.renderer.isSVG && "SPAN" === f.nodeName && a.parentGroup, b = f.ownerSVGElement;
                f.onclick = f.onmouseout = f.onmouseover = f.onmousemove = f.point = null;
                R(a);
                a.clipPath && b && (d(b.querySelectorAll("[clip-path]"), function (x) {
                    -1 < x.getAttribute("clip-path").indexOf(a.clipPath.element.id +
                        ")") && x.removeAttribute("clip-path")
                }), a.clipPath = a.clipPath.destroy());
                if (a.stops) {
                    for (b = 0; b < a.stops.length; b++)a.stops[b] = a.stops[b].destroy();
                    a.stops = null
                }
                a.safeRemoveChild(f);
                for (a.destroyShadows(); t && t.div && 0 === t.div.childNodes.length;)f = t.parentGroup, a.safeRemoveChild(t.div), delete t.div, t = f;
                a.alignTo && w(a.renderer.alignedObjects, a);
                I(a, function (x, f) {
                    delete a[f]
                });
                return null
            },
            shadow: function (a, f, t) {
                var x = [], b, l, c = this.element, r, d, p, e;
                if (!a)this.destroyShadows(); else if (!this.shadows) {
                    d = L(a.width,
                        3);
                    p = (a.opacity || .15) / d;
                    e = this.parentInverted ? "(-1,-1)" : "(" + L(a.offsetX, 1) + ", " + L(a.offsetY, 1) + ")";
                    for (b = 1; b <= d; b++)l = c.cloneNode(0), r = 2 * d + 1 - 2 * b, m(l, {
                        isShadow: "true",
                        stroke: a.color || "#000000",
                        "stroke-opacity": p * b,
                        "stroke-width": r,
                        transform: "translate" + e,
                        fill: "none"
                    }), t && (m(l, "height", Math.max(m(l, "height") - r, 0)), l.cutHeight = r), f ? f.element.appendChild(l) : c.parentNode.insertBefore(l, c), x.push(l);
                    this.shadows = x
                }
                return this
            },
            destroyShadows: function () {
                d(this.shadows || [], function (a) {
                        this.safeRemoveChild(a)
                    },
                    this);
                this.shadows = void 0
            },
            xGetter: function (a) {
                "circle" === this.element.nodeName && ("x" === a ? a = "cx" : "y" === a && (a = "cy"));
                return this._defaultGetter(a)
            },
            _defaultGetter: function (a) {
                a = L(this[a], this.element ? this.element.getAttribute(a) : null, 0);
                /^[\-0-9\.]+$/.test(a) && (a = parseFloat(a));
                return a
            },
            dSetter: function (a, f, t) {
                a && a.join && (a = a.join(" "));
                /(NaN| {2}|^$)/.test(a) && (a = "M 0 0");
                t.setAttribute(f, a);
                this[f] = a
            },
            dashstyleSetter: function (a) {
                var x, t = this["stroke-width"];
                "inherit" === t && (t = 1);
                if (a = a && a.toLowerCase()) {
                    a =
                        a.replace("shortdashdotdot", "3,1,1,1,1,1,").replace("shortdashdot", "3,1,1,1").replace("shortdot", "1,1,").replace("shortdash", "3,1,").replace("longdash", "8,3,").replace(/dot/g, "1,3,").replace("dash", "4,3,").replace(/,$/, "").split(",");
                    for (x = a.length; x--;)a[x] = f(a[x]) * t;
                    a = a.join(",").replace(/NaN/g, "none");
                    this.element.setAttribute("stroke-dasharray", a)
                }
            },
            alignSetter: function (a) {
                this.element.setAttribute("text-anchor", {left: "start", center: "middle", right: "end"}[a])
            },
            opacitySetter: function (a, f, t) {
                this[f] =
                    a;
                t.setAttribute(f, a)
            },
            titleSetter: function (a) {
                var f = this.element.getElementsByTagName("title")[0];
                f || (f = n.createElementNS(this.SVG_NS, "title"), this.element.appendChild(f));
                f.firstChild && f.removeChild(f.firstChild);
                f.appendChild(n.createTextNode(String(L(a), "").replace(/<[^>]*>/g, "")))
            },
            textSetter: function (a) {
                a !== this.textStr && (delete this.bBox, this.textStr = a, this.added && this.renderer.buildText(this))
            },
            fillSetter: function (a, f, t) {
                "string" === typeof a ? t.setAttribute(f, a) : a && this.colorGradient(a, f, t)
            },
            visibilitySetter: function (a, f, t) {
                "inherit" === a ? t.removeAttribute(f) : t.setAttribute(f, a)
            },
            zIndexSetter: function (a, t) {
                var x = this.renderer, b = this.parentGroup, l = (b || x).element || x.box, c, r = this.element, d;
                c = this.added;
                var p;
                u(a) && (r.zIndex = a, a = +a, this[t] === a && (c = !1), this[t] = a);
                if (c) {
                    (a = this.zIndex) && b && (b.handleZ = !0);
                    t = l.childNodes;
                    for (p = 0; p < t.length && !d; p++)b = t[p], c = b.zIndex, b !== r && (f(c) > a || !u(a) && u(c) || 0 > a && !u(c) && l !== x.box) && (l.insertBefore(r, b), d = !0);
                    d || l.appendChild(r)
                }
                return d
            },
            _defaultSetter: function (a,
                                      f, t) {
                t.setAttribute(f, a)
            }
        });
        C.prototype.yGetter = C.prototype.xGetter;
        C.prototype.translateXSetter = C.prototype.translateYSetter = C.prototype.rotationSetter = C.prototype.verticalAlignSetter = C.prototype.scaleXSetter = C.prototype.scaleYSetter = function (a, f) {
            this[f] = a;
            this.doTransform = !0
        };
        C.prototype["stroke-widthSetter"] = C.prototype.strokeSetter = function (a, f, t) {
            this[f] = a;
            this.stroke && this["stroke-width"] ? (C.prototype.fillSetter.call(this, this.stroke, "stroke", t), t.setAttribute("stroke-width", this["stroke-width"]),
                this.hasStroke = !0) : "stroke-width" === f && 0 === a && this.hasStroke && (t.removeAttribute("stroke"), this.hasStroke = !1)
        };
        A = a.SVGRenderer = function () {
            this.init.apply(this, arguments)
        };
        c(A.prototype, {
            Element: C, SVG_NS: N, init: function (a, f, t, b, c, r) {
                var x;
                b = this.createElement("svg").attr({version: "1.1", "class": "highcharts-root"}).css(this.getStyle(b));
                x = b.element;
                a.appendChild(x);
                -1 === a.innerHTML.indexOf("xmlns") && m(x, "xmlns", this.SVG_NS);
                this.isSVG = !0;
                this.box = x;
                this.boxWrapper = b;
                this.alignedObjects = [];
                this.url = (l ||
                M) && n.getElementsByTagName("base").length ? P.location.href.replace(/#.*?$/, "").replace(/<[^>]*>/g, "").replace(/([\('\)])/g, "\\$1").replace(/ /g, "%20") : "";
                this.createElement("desc").add().element.appendChild(n.createTextNode("Created with Highcharts 5.0.12"));
                this.defs = this.createElement("defs").add();
                this.allowHTML = r;
                this.forExport = c;
                this.gradients = {};
                this.cache = {};
                this.cacheKeys = [];
                this.imgCount = 0;
                this.setSize(f, t, !1);
                var d;
                l && a.getBoundingClientRect && (f = function () {
                    q(a, {left: 0, top: 0});
                    d = a.getBoundingClientRect();
                    q(a, {left: Math.ceil(d.left) - d.left + "px", top: Math.ceil(d.top) - d.top + "px"})
                }, f(), this.unSubPixelFix = G(P, "resize", f))
            }, getStyle: function (a) {
                return this.style = c({
                    fontFamily: '"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',
                    fontSize: "12px"
                }, a)
            }, setStyle: function (a) {
                this.boxWrapper.css(this.getStyle(a))
            }, isHidden: function () {
                return !this.boxWrapper.getBBox().width
            }, destroy: function () {
                var a = this.defs;
                this.box = null;
                this.boxWrapper = this.boxWrapper.destroy();
                e(this.gradients || {});
                this.gradients =
                    null;
                a && (this.defs = a.destroy());
                this.unSubPixelFix && this.unSubPixelFix();
                return this.alignedObjects = null
            }, createElement: function (a) {
                var f = new this.Element;
                f.init(this, a);
                return f
            }, draw: E, getRadialAttr: function (a, f) {
                return {cx: a[0] - a[2] / 2 + f.cx * a[2], cy: a[1] - a[2] / 2 + f.cy * a[2], r: f.r * a[2]}
            }, getSpanWidth: function (a, f) {
                var t = a.getBBox(!0).width;
                !J && this.forExport && (t = this.measureSpanWidth(f.firstChild.data, a.styles));
                return t
            }, applyEllipsis: function (a, f, t, b) {
                var x = this.getSpanWidth(a, f), l = x > b, x = t, c, r = 0, d =
                    t.length, p = function (a) {
                    f.removeChild(f.firstChild);
                    a && f.appendChild(n.createTextNode(a))
                };
                if (l) {
                    for (; r <= d;)c = Math.ceil((r + d) / 2), x = t.substring(0, c) + "\u2026", p(x), x = this.getSpanWidth(a, f), r === d ? r = d + 1 : x > b ? d = c - 1 : r = c;
                    0 === d && p("")
                }
                return l
            }, buildText: function (a) {
                var t = a.element, x = this, l = x.forExport, c = L(a.textStr, "").toString(), r = -1 !== c.indexOf("\x3c"), p = t.childNodes, e, h, E, y, w = m(t, "x"), B = a.styles, g = a.textWidth, I = B && B.lineHeight, z = B && B.textOutline, D = B && "ellipsis" === B.textOverflow, k = B && "nowrap" === B.whiteSpace,
                    u = B && B.fontSize, R, H, v = p.length, B = g && !a.added && this.box, M = function (a) {
                        var b;
                        b = /(px|em)$/.test(a && a.style.fontSize) ? a.style.fontSize : u || x.style.fontSize || 12;
                        return I ? f(I) : x.fontMetrics(b, a.getAttribute("style") ? a : t).h
                    };
                R = [c, D, k, I, z, u, g].join();
                if (R !== a.textCache) {
                    for (a.textCache = R; v--;)t.removeChild(p[v]);
                    r || z || D || g || -1 !== c.indexOf(" ") ? (e = /<.*class="([^"]+)".*>/, h = /<.*style="([^"]+)".*>/, E = /<.*href="([^"]+)".*>/, B && B.appendChild(t), c = r ? c.replace(/<(b|strong)>/g, '\x3cspan style\x3d"font-weight:bold"\x3e').replace(/<(i|em)>/g,
                        '\x3cspan style\x3d"font-style:italic"\x3e').replace(/<a/g, "\x3cspan").replace(/<\/(b|strong|i|em|a)>/g, "\x3c/span\x3e").split(/<br.*?>/g) : [c], c = b(c, function (a) {
                        return "" !== a
                    }), d(c, function (f, b) {
                        var c, r = 0;
                        f = f.replace(/^\s+|\s+$/g, "").replace(/<span/g, "|||\x3cspan").replace(/<\/span>/g, "\x3c/span\x3e|||");
                        c = f.split("|||");
                        d(c, function (f) {
                            if ("" !== f || 1 === c.length) {
                                var d = {}, p = n.createElementNS(x.SVG_NS, "tspan"), B, I;
                                e.test(f) && (B = f.match(e)[1], m(p, "class", B));
                                h.test(f) && (I = f.match(h)[1].replace(/(;| |^)color([ :])/,
                                    "$1fill$2"), m(p, "style", I));
                                E.test(f) && !l && (m(p, "onclick", 'location.href\x3d"' + f.match(E)[1] + '"'), q(p, {cursor: "pointer"}));
                                f = (f.replace(/<(.|\n)*?>/g, "") || " ").replace(/&lt;/g, "\x3c").replace(/&gt;/g, "\x3e");
                                if (" " !== f) {
                                    p.appendChild(n.createTextNode(f));
                                    r ? d.dx = 0 : b && null !== w && (d.x = w);
                                    m(p, d);
                                    t.appendChild(p);
                                    !r && H && (!J && l && q(p, {display: "block"}), m(p, "dy", M(p)));
                                    if (g) {
                                        d = f.replace(/([^\^])-/g, "$1- ").split(" ");
                                        B = 1 < c.length || b || 1 < d.length && !k;
                                        var z = [], Q, u = M(p), R = a.rotation;
                                        for (D && (y = x.applyEllipsis(a,
                                            p, f, g)); !D && B && (d.length || z.length);)a.rotation = 0, Q = x.getSpanWidth(a, p), f = Q > g, void 0 === y && (y = f), f && 1 !== d.length ? (p.removeChild(p.firstChild), z.unshift(d.pop())) : (d = z, z = [], d.length && !k && (p = n.createElementNS(N, "tspan"), m(p, {
                                            dy: u,
                                            x: w
                                        }), I && m(p, "style", I), t.appendChild(p)), Q > g && (g = Q)), d.length && p.appendChild(n.createTextNode(d.join(" ").replace(/- /g, "-")));
                                        a.rotation = R
                                    }
                                    r++
                                }
                            }
                        });
                        H = H || t.childNodes.length
                    }), y && a.attr("title", a.textStr), B && B.removeChild(t), z && a.applyTextOutline && a.applyTextOutline(z)) : t.appendChild(n.createTextNode(c.replace(/&lt;/g,
                        "\x3c").replace(/&gt;/g, "\x3e")))
                }
            }, getContrast: function (a) {
                a = k(a).rgba;
                return 510 < a[0] + a[1] + a[2] ? "#000000" : "#FFFFFF"
            }, button: function (a, f, t, b, l, r, d, e, h) {
                var x = this.label(a, f, t, h, null, null, null, null, "button"), n = 0;
                x.attr(p({padding: 8, r: 2}, l));
                var E, y, w, J;
                l = p({
                    fill: "#f7f7f7",
                    stroke: "#cccccc",
                    "stroke-width": 1,
                    style: {color: "#e0faff", cursor: "pointer", fontWeight: "normal"}
                }, l);
                E = l.style;
                delete l.style;
                r = p(l, {fill: "#e6e6e6"}, r);
                y = r.style;
                delete r.style;
                d = p(l, {fill: "#e6ebf5", style: {color: "#000000", fontWeight: "bold"}},
                    d);
                w = d.style;
                delete d.style;
                e = p(l, {style: {color: "#cccccc"}}, e);
                J = e.style;
                delete e.style;
                G(x.element, B ? "mouseover" : "mouseenter", function () {
                    3 !== n && x.setState(1)
                });
                G(x.element, B ? "mouseout" : "mouseleave", function () {
                    3 !== n && x.setState(n)
                });
                x.setState = function (a) {
                    1 !== a && (x.state = n = a);
                    x.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass("highcharts-button-" + ["normal", "hover", "pressed", "disabled"][a || 0]);
                    x.attr([l, r, d, e][a || 0]).css([E, y, w, J][a || 0])
                };
                x.attr(l).css(c({cursor: "default"},
                    E));
                return x.on("click", function (a) {
                    3 !== n && b.call(x, a)
                })
            }, crispLine: function (a, f) {
                a[1] === a[4] && (a[1] = a[4] = Math.round(a[1]) - f % 2 / 2);
                a[2] === a[5] && (a[2] = a[5] = Math.round(a[2]) + f % 2 / 2);
                return a
            }, path: function (a) {
                var f = {fill: "none"};
                H(a) ? f.d = a : r(a) && c(f, a);
                return this.createElement("path").attr(f)
            }, circle: function (a, f, t) {
                a = r(a) ? a : {x: a, y: f, r: t};
                f = this.createElement("circle");
                f.xSetter = f.ySetter = function (a, f, t) {
                    t.setAttribute("c" + f, a)
                };
                return f.attr(a)
            }, arc: function (a, f, t, b, l, c) {
                r(a) ? (b = a, f = b.y, t = b.r, a = b.x) :
                    b = {innerR: b, start: l, end: c};
                a = this.symbol("arc", a, f, t, t, b);
                a.r = t;
                return a
            }, rect: function (a, f, t, b, l, c) {
                l = r(a) ? a.r : l;
                var x = this.createElement("rect");
                a = r(a) ? a : void 0 === a ? {} : {x: a, y: f, width: Math.max(t, 0), height: Math.max(b, 0)};
                void 0 !== c && (a.strokeWidth = c, a = x.crisp(a));
                a.fill = "none";
                l && (a.r = l);
                x.rSetter = function (a, f, t) {
                    m(t, {rx: a, ry: a})
                };
                return x.attr(a)
            }, setSize: function (a, f, t) {
                var b = this.alignedObjects, l = b.length;
                this.width = a;
                this.height = f;
                for (this.boxWrapper.animate({width: a, height: f}, {
                    step: function () {
                        this.attr({
                            viewBox: "0 0 " +
                            this.attr("width") + " " + this.attr("height")
                        })
                    }, duration: L(t, !0) ? void 0 : 0
                }); l--;)b[l].align()
            }, g: function (a) {
                var f = this.createElement("g");
                return a ? f.attr({"class": "highcharts-" + a}) : f
            }, image: function (a, f, t, b, l) {
                var x = {preserveAspectRatio: "none"};
                1 < arguments.length && c(x, {x: f, y: t, width: b, height: l});
                x = this.createElement("image").attr(x);
                x.element.setAttributeNS ? x.element.setAttributeNS("http://www.w3.org/1999/xlink", "href", a) : x.element.setAttribute("hc-svg-href", a);
                return x
            }, symbol: function (a, f, t, b, l,
                                 r) {
                var x = this, p, e = /^url\((.*?)\)$/, h = e.test(a), E = !h && (this.symbols[a] ? a : "circle"), y = E && this.symbols[E], B = u(f) && y && y.call(this.symbols, Math.round(f), Math.round(t), b, l, r), w, J;
                y ? (p = this.path(B), p.attr("fill", "none"), c(p, {
                    symbolName: E,
                    x: f,
                    y: t,
                    width: b,
                    height: l
                }), r && c(p, r)) : h && (w = a.match(e)[1], p = this.image(w), p.imgwidth = L(O[w] && O[w].width, r && r.width), p.imgheight = L(O[w] && O[w].height, r && r.height), J = function () {
                    p.attr({width: p.width, height: p.height})
                }, d(["width", "height"], function (a) {
                    p[a + "Setter"] = function (a,
                                                f) {
                        var t = {}, b = this["img" + f], l = "width" === f ? "translateX" : "translateY";
                        this[f] = a;
                        u(b) && (this.element && this.element.setAttribute(f, b), this.alignByTranslate || (t[l] = ((this[f] || 0) - b) / 2, this.attr(t)))
                    }
                }), u(f) && p.attr({
                    x: f,
                    y: t
                }), p.isImg = !0, u(p.imgwidth) && u(p.imgheight) ? J() : (p.attr({width: 0, height: 0}), v("img", {
                    onload: function () {
                        var a = g[x.chartIndex];
                        0 === this.width && (q(this, {position: "absolute", top: "-999em"}), n.body.appendChild(this));
                        O[w] = {width: this.width, height: this.height};
                        p.imgwidth = this.width;
                        p.imgheight =
                            this.height;
                        p.element && J();
                        this.parentNode && this.parentNode.removeChild(this);
                        x.imgCount--;
                        if (!x.imgCount && a && a.onload)a.onload()
                    }, src: w
                }), this.imgCount++));
                return p
            }, symbols: {
                circle: function (a, f, t, b) {
                    return this.arc(a + t / 2, f + b / 2, t / 2, b / 2, {start: 0, end: 2 * Math.PI, open: !1})
                }, square: function (a, f, t, b) {
                    return ["M", a, f, "L", a + t, f, a + t, f + b, a, f + b, "Z"]
                }, triangle: function (a, f, t, b) {
                    return ["M", a + t / 2, f, "L", a + t, f + b, a, f + b, "Z"]
                }, "triangle-down": function (a, f, t, b) {
                    return ["M", a, f, "L", a + t, f, a + t / 2, f + b, "Z"]
                }, diamond: function (a,
                                      f, t, b) {
                    return ["M", a + t / 2, f, "L", a + t, f + b / 2, a + t / 2, f + b, a, f + b / 2, "Z"]
                }, arc: function (a, f, t, b, l) {
                    var c = l.start, x = l.r || t, r = l.r || b || t, p = l.end - .001;
                    t = l.innerR;
                    b = l.open;
                    var d = Math.cos(c), e = Math.sin(c), h = Math.cos(p), p = Math.sin(p);
                    l = l.end - c < Math.PI ? 0 : 1;
                    x = ["M", a + x * d, f + r * e, "A", x, r, 0, l, 1, a + x * h, f + r * p];
                    u(t) && x.push(b ? "M" : "L", a + t * h, f + t * p, "A", t, t, 0, l, 0, a + t * d, f + t * e);
                    x.push(b ? "" : "Z");
                    return x
                }, callout: function (a, f, t, b, l) {
                    var c = Math.min(l && l.r || 0, t, b), r = c + 6, p = l && l.anchorX;
                    l = l && l.anchorY;
                    var d;
                    d = ["M", a + c, f, "L", a + t - c, f, "C",
                        a + t, f, a + t, f, a + t, f + c, "L", a + t, f + b - c, "C", a + t, f + b, a + t, f + b, a + t - c, f + b, "L", a + c, f + b, "C", a, f + b, a, f + b, a, f + b - c, "L", a, f + c, "C", a, f, a, f, a + c, f];
                    p && p > t ? l > f + r && l < f + b - r ? d.splice(13, 3, "L", a + t, l - 6, a + t + 6, l, a + t, l + 6, a + t, f + b - c) : d.splice(13, 3, "L", a + t, b / 2, p, l, a + t, b / 2, a + t, f + b - c) : p && 0 > p ? l > f + r && l < f + b - r ? d.splice(33, 3, "L", a, l + 6, a - 6, l, a, l - 6, a, f + c) : d.splice(33, 3, "L", a, b / 2, p, l, a, b / 2, a, f + c) : l && l > b && p > a + r && p < a + t - r ? d.splice(23, 3, "L", p + 6, f + b, p, f + b + 6, p - 6, f + b, a + c, f + b) : l && 0 > l && p > a + r && p < a + t - r && d.splice(3, 3, "L", p - 6, f, p, f - 6, p + 6, f, t - c, f);
                    return d
                }
            },
            clipRect: function (f, t, b, l) {
                var c = a.uniqueKey(), r = this.createElement("clipPath").attr({id: c}).add(this.defs);
                f = this.rect(f, t, b, l, 0).add(r);
                f.id = c;
                f.clipPath = r;
                f.count = 0;
                return f
            }, text: function (a, f, t, b) {
                var l = !J && this.forExport, c = {};
                if (b && (this.allowHTML || !this.forExport))return this.html(a, f, t);
                c.x = Math.round(f || 0);
                t && (c.y = Math.round(t));
                if (a || 0 === a)c.text = a;
                a = this.createElement("text").attr(c);
                l && a.css({position: "absolute"});
                b || (a.xSetter = function (a, f, t) {
                    var b = t.getElementsByTagName("tspan"), l, c =
                        t.getAttribute(f), r;
                    for (r = 0; r < b.length; r++)l = b[r], l.getAttribute(f) === c && l.setAttribute(f, a);
                    t.setAttribute(f, a)
                });
                return a
            }, fontMetrics: function (a, t) {
                a = a || t && t.style && t.style.fontSize || this.style && this.style.fontSize;
                a = /px/.test(a) ? f(a) : /em/.test(a) ? parseFloat(a) * (t ? this.fontMetrics(null, t.parentNode).f : 16) : 12;
                t = 24 > a ? a + 3 : Math.round(1.2 * a);
                return {h: t, b: Math.round(.8 * t), f: a}
            }, rotCorr: function (a, f, t) {
                var b = a;
                f && t && (b = Math.max(b * Math.cos(f * h), 4));
                return {x: -a / 3 * Math.sin(f * h), y: b}
            }, label: function (f, b,
                                l, r, e, h, n, E, y) {
                var x = this, B = x.g("button" !== y && "label"), w = B.text = x.text("", 0, 0, n).attr({zIndex: 1}), J, g, I = 0, z = 3, D = 0, q, k, m, R, H, v = {}, N, M, L = /^url\((.*?)\)$/.test(r), Q = L, V, U, O, P;
                y && B.addClass("highcharts-" + y);
                Q = L;
                V = function () {
                    return (N || 0) % 2 / 2
                };
                U = function () {
                    var a = w.element.style, f = {};
                    g = (void 0 === q || void 0 === k || H) && u(w.textStr) && w.getBBox();
                    B.width = (q || g.width || 0) + 2 * z + D;
                    B.height = (k || g.height || 0) + 2 * z;
                    M = z + x.fontMetrics(a && a.fontSize, w).b;
                    Q && (J || (B.box = J = x.symbols[r] || L ? x.symbol(r) : x.rect(), J.addClass(("button" ===
                        y ? "" : "highcharts-label-box") + (y ? " highcharts-" + y + "-box" : "")), J.add(B), a = V(), f.x = a, f.y = (E ? -M : 0) + a), f.width = Math.round(B.width), f.height = Math.round(B.height), J.attr(c(f, v)), v = {})
                };
                O = function () {
                    var a = D + z, f;
                    f = E ? 0 : M;
                    u(q) && g && ("center" === H || "right" === H) && (a += {center: .5, right: 1}[H] * (q - g.width));
                    if (a !== w.x || f !== w.y)w.attr("x", a), void 0 !== f && w.attr("y", f);
                    w.x = a;
                    w.y = f
                };
                P = function (a, f) {
                    J ? J.attr(a, f) : v[a] = f
                };
                B.onAdd = function () {
                    w.add(B);
                    B.attr({text: f || 0 === f ? f : "", x: b, y: l});
                    J && u(e) && B.attr({anchorX: e, anchorY: h})
                };
                B.widthSetter = function (f) {
                    q = a.isNumber(f) ? f : null
                };
                B.heightSetter = function (a) {
                    k = a
                };
                B["text-alignSetter"] = function (a) {
                    H = a
                };
                B.paddingSetter = function (a) {
                    u(a) && a !== z && (z = B.padding = a, O())
                };
                B.paddingLeftSetter = function (a) {
                    u(a) && a !== D && (D = a, O())
                };
                B.alignSetter = function (a) {
                    a = {left: 0, center: .5, right: 1}[a];
                    a !== I && (I = a, g && B.attr({x: m}))
                };
                B.textSetter = function (a) {
                    void 0 !== a && w.textSetter(a);
                    U();
                    O()
                };
                B["stroke-widthSetter"] = function (a, f) {
                    a && (Q = !0);
                    N = this["stroke-width"] = a;
                    P(f, a)
                };
                B.strokeSetter = B.fillSetter = B.rSetter =
                    function (a, f) {
                        "fill" === f && a && (Q = !0);
                        P(f, a)
                    };
                B.anchorXSetter = function (a, f) {
                    e = B.anchorX = a;
                    P(f, Math.round(a) - V() - m)
                };
                B.anchorYSetter = function (a, f) {
                    h = B.anchorY = a;
                    P(f, a - R)
                };
                B.xSetter = function (a) {
                    B.x = a;
                    I && (a -= I * ((q || g.width) + 2 * z));
                    m = Math.round(a);
                    B.attr("translateX", m)
                };
                B.ySetter = function (a) {
                    R = B.y = Math.round(a);
                    B.attr("translateY", R)
                };
                var W = B.css;
                return c(B, {
                    css: function (a) {
                        if (a) {
                            var f = {};
                            a = p(a);
                            d(B.textProps, function (t) {
                                void 0 !== a[t] && (f[t] = a[t], delete a[t])
                            });
                            w.css(f)
                        }
                        return W.call(B, a)
                    }, getBBox: function () {
                        return {
                            width: g.width +
                            2 * z, height: g.height + 2 * z, x: g.x - z, y: g.y - z
                        }
                    }, shadow: function (a) {
                        a && (U(), J && J.shadow(a));
                        return B
                    }, destroy: function () {
                        t(B.element, "mouseenter");
                        t(B.element, "mouseleave");
                        w && (w = w.destroy());
                        J && (J = J.destroy());
                        C.prototype.destroy.call(B);
                        B = x = U = O = P = null
                    }
                })
            }
        });
        a.Renderer = A
    })(K);
    (function (a) {
        var C = a.attr, A = a.createElement, G = a.css, F = a.defined, m = a.each, g = a.extend, k = a.isFirefox, q = a.isMS, v = a.isWebKit, u = a.pInt, h = a.SVGRenderer, e = a.win, n = a.wrap;
        g(a.SVGElement.prototype, {
            htmlCss: function (a) {
                var c = this.element;
                if (c =
                        a && "SPAN" === c.tagName && a.width)delete a.width, this.textWidth = c, this.updateTransform();
                a && "ellipsis" === a.textOverflow && (a.whiteSpace = "nowrap", a.overflow = "hidden");
                this.styles = g(this.styles, a);
                G(this.element, a);
                return this
            }, htmlGetBBox: function () {
                var a = this.element;
                "text" === a.nodeName && (a.style.position = "absolute");
                return {x: a.offsetLeft, y: a.offsetTop, width: a.offsetWidth, height: a.offsetHeight}
            }, htmlUpdateTransform: function () {
                if (this.added) {
                    var a = this.renderer, c = this.element, e = this.translateX || 0, b = this.translateY ||
                        0, h = this.x || 0, n = this.y || 0, g = this.textAlign || "left", l = {
                        left: 0,
                        center: .5,
                        right: 1
                    }[g], B = this.styles;
                    G(c, {marginLeft: e, marginTop: b});
                    this.shadows && m(this.shadows, function (a) {
                        G(a, {marginLeft: e + 1, marginTop: b + 1})
                    });
                    this.inverted && m(c.childNodes, function (b) {
                        a.invertChild(b, c)
                    });
                    if ("SPAN" === c.tagName) {
                        var r = this.rotation, z = u(this.textWidth), q = B && B.whiteSpace, p = [r, g, c.innerHTML, this.textWidth, this.textAlign].join();
                        p !== this.cTT && (B = a.fontMetrics(c.style.fontSize).b, F(r) && this.setSpanRotation(r, l, B), G(c, {
                            width: "",
                            whiteSpace: q || "nowrap"
                        }), c.offsetWidth > z && /[ \-]/.test(c.textContent || c.innerText) && G(c, {
                            width: z + "px",
                            display: "block",
                            whiteSpace: q || "normal"
                        }), this.getSpanCorrection(c.offsetWidth, B, l, r, g));
                        G(c, {left: h + (this.xCorr || 0) + "px", top: n + (this.yCorr || 0) + "px"});
                        v && (B = c.offsetHeight);
                        this.cTT = p
                    }
                } else this.alignOnAdd = !0
            }, setSpanRotation: function (a, c, h) {
                var b = {}, d = q ? "-ms-transform" : v ? "-webkit-transform" : k ? "MozTransform" : e.opera ? "-o-transform" : "";
                b[d] = b.transform = "rotate(" + a + "deg)";
                b[d + (k ? "Origin" : "-origin")] =
                    b.transformOrigin = 100 * c + "% " + h + "px";
                G(this.element, b)
            }, getSpanCorrection: function (a, c, e) {
                this.xCorr = -a * e;
                this.yCorr = -c
            }
        });
        g(h.prototype, {
            html: function (a, c, e) {
                var b = this.createElement("span"), d = b.element, h = b.renderer, w = h.isSVG, l = function (a, b) {
                    m(["opacity", "visibility"], function (l) {
                        n(a, l + "Setter", function (a, l, c, r) {
                            a.call(this, l, c, r);
                            b[c] = l
                        })
                    })
                };
                b.textSetter = function (a) {
                    a !== d.innerHTML && delete this.bBox;
                    d.innerHTML = this.textStr = a;
                    b.htmlUpdateTransform()
                };
                w && l(b, b.element.style);
                b.xSetter = b.ySetter = b.alignSetter =
                    b.rotationSetter = function (a, l) {
                        "align" === l && (l = "textAlign");
                        b[l] = a;
                        b.htmlUpdateTransform()
                    };
                b.attr({text: a, x: Math.round(c), y: Math.round(e)}).css({
                    fontFamily: this.style.fontFamily,
                    fontSize: this.style.fontSize,
                    position: "absolute"
                });
                d.style.whiteSpace = "nowrap";
                b.css = b.htmlCss;
                w && (b.add = function (a) {
                    var c, e = h.box.parentNode, B = [];
                    if (this.parentGroup = a) {
                        if (c = a.div, !c) {
                            for (; a;)B.push(a), a = a.parentGroup;
                            m(B.reverse(), function (a) {
                                var r, p = C(a.element, "class");
                                p && (p = {className: p});
                                c = a.div = a.div || A("div", p, {
                                        position: "absolute",
                                        left: (a.translateX || 0) + "px",
                                        top: (a.translateY || 0) + "px",
                                        display: a.display,
                                        opacity: a.opacity,
                                        pointerEvents: a.styles && a.styles.pointerEvents
                                    }, c || e);
                                r = c.style;
                                g(a, {
                                    on: function () {
                                        b.on.apply({element: B[0].div}, arguments);
                                        return a
                                    }, translateXSetter: function (b, f) {
                                        r.left = b + "px";
                                        a[f] = b;
                                        a.doTransform = !0
                                    }, translateYSetter: function (b, f) {
                                        r.top = b + "px";
                                        a[f] = b;
                                        a.doTransform = !0
                                    }
                                });
                                l(a, r)
                            })
                        }
                    } else c = e;
                    c.appendChild(d);
                    b.added = !0;
                    b.alignOnAdd && b.htmlUpdateTransform();
                    return b
                });
                return b
            }
        })
    })(K);
    (function (a) {
        var C, A, G =
            a.createElement, F = a.css, m = a.defined, g = a.deg2rad, k = a.discardElement, q = a.doc, v = a.each, u = a.erase, h = a.extend;
        C = a.extendClass;
        var e = a.isArray, n = a.isNumber, d = a.isObject, c = a.merge;
        A = a.noop;
        var w = a.pick, b = a.pInt, y = a.SVGElement, D = a.SVGRenderer, H = a.win;
        a.svg || (A = {
            docMode8: q && 8 === q.documentMode, init: function (a, b) {
                var l = ["\x3c", b, ' filled\x3d"f" stroked\x3d"f"'], c = ["position: ", "absolute", ";"], d = "div" === b;
                ("shape" === b || d) && c.push("left:0;top:0;width:1px;height:1px;");
                c.push("visibility: ", d ? "hidden" : "visible");
                l.push(' style\x3d"', c.join(""), '"/\x3e');
                b && (l = d || "span" === b || "img" === b ? l.join("") : a.prepVML(l), this.element = G(l));
                this.renderer = a
            }, add: function (a) {
                var b = this.renderer, l = this.element, c = b.box, d = a && a.inverted, c = a ? a.element || a : c;
                a && (this.parentGroup = a);
                d && b.invertChild(l, c);
                c.appendChild(l);
                this.added = !0;
                this.alignOnAdd && !this.deferUpdateTransform && this.updateTransform();
                if (this.onAdd)this.onAdd();
                this.className && this.attr("class", this.className);
                return this
            }, updateTransform: y.prototype.htmlUpdateTransform,
            setSpanRotation: function () {
                var a = this.rotation, b = Math.cos(a * g), c = Math.sin(a * g);
                F(this.element, {filter: a ? ["progid:DXImageTransform.Microsoft.Matrix(M11\x3d", b, ", M12\x3d", -c, ", M21\x3d", c, ", M22\x3d", b, ", sizingMethod\x3d'auto expand')"].join("") : "none"})
            }, getSpanCorrection: function (a, b, c, d, e) {
                var l = d ? Math.cos(d * g) : 1, r = d ? Math.sin(d * g) : 0, h = w(this.elemHeight, this.element.offsetHeight), n;
                this.xCorr = 0 > l && -a;
                this.yCorr = 0 > r && -h;
                n = 0 > l * r;
                this.xCorr += r * b * (n ? 1 - c : c);
                this.yCorr -= l * b * (d ? n ? c : 1 - c : 1);
                e && "left" !==
                e && (this.xCorr -= a * c * (0 > l ? -1 : 1), d && (this.yCorr -= h * c * (0 > r ? -1 : 1)), F(this.element, {textAlign: e}))
            }, pathToVML: function (a) {
                for (var b = a.length, l = []; b--;)n(a[b]) ? l[b] = Math.round(10 * a[b]) - 5 : "Z" === a[b] ? l[b] = "x" : (l[b] = a[b], !a.isArc || "wa" !== a[b] && "at" !== a[b] || (l[b + 5] === l[b + 7] && (l[b + 7] += a[b + 7] > a[b + 5] ? 1 : -1), l[b + 6] === l[b + 8] && (l[b + 8] += a[b + 8] > a[b + 6] ? 1 : -1)));
                return l.join(" ") || "x"
            }, clip: function (a) {
                var b = this, l;
                a ? (l = a.members, u(l, b), l.push(b), b.destroyClip = function () {
                    u(l, b)
                }, a = a.getCSS(b)) : (b.destroyClip && b.destroyClip(),
                    a = {clip: b.docMode8 ? "inherit" : "rect(auto)"});
                return b.css(a)
            }, css: y.prototype.htmlCss, safeRemoveChild: function (a) {
                a.parentNode && k(a)
            }, destroy: function () {
                this.destroyClip && this.destroyClip();
                return y.prototype.destroy.apply(this)
            }, on: function (a, b) {
                this.element["on" + a] = function () {
                    var a = H.event;
                    a.target = a.srcElement;
                    b(a)
                };
                return this
            }, cutOffPath: function (a, c) {
                var l;
                a = a.split(/[ ,]/);
                l = a.length;
                if (9 === l || 11 === l)a[l - 4] = a[l - 2] = b(a[l - 2]) - 10 * c;
                return a.join(" ")
            }, shadow: function (a, c, d) {
                var l = [], r, p = this.element,
                    e = this.renderer, h, n = p.style, f, t = p.path, y, J, g, B;
                t && "string" !== typeof t.value && (t = "x");
                J = t;
                if (a) {
                    g = w(a.width, 3);
                    B = (a.opacity || .15) / g;
                    for (r = 1; 3 >= r; r++)y = 2 * g + 1 - 2 * r, d && (J = this.cutOffPath(t.value, y + .5)), f = ['\x3cshape isShadow\x3d"true" strokeweight\x3d"', y, '" filled\x3d"false" path\x3d"', J, '" coordsize\x3d"10 10" style\x3d"', p.style.cssText, '" /\x3e'], h = G(e.prepVML(f), null, {
                        left: b(n.left) + w(a.offsetX, 1),
                        top: b(n.top) + w(a.offsetY, 1)
                    }), d && (h.cutOff = y + 1), f = ['\x3cstroke color\x3d"', a.color || "#000000", '" opacity\x3d"',
                        B * r, '"/\x3e'], G(e.prepVML(f), null, null, h), c ? c.element.appendChild(h) : p.parentNode.insertBefore(h, p), l.push(h);
                    this.shadows = l
                }
                return this
            }, updateShadows: A, setAttr: function (a, b) {
                this.docMode8 ? this.element[a] = b : this.element.setAttribute(a, b)
            }, classSetter: function (a) {
                (this.added ? this.element : this).className = a
            }, dashstyleSetter: function (a, b, c) {
                (c.getElementsByTagName("stroke")[0] || G(this.renderer.prepVML(["\x3cstroke/\x3e"]), null, null, c))[b] = a || "solid";
                this[b] = a
            }, dSetter: function (a, b, c) {
                var l = this.shadows;
                a = a || [];
                this.d = a.join && a.join(" ");
                c.path = a = this.pathToVML(a);
                if (l)for (c = l.length; c--;)l[c].path = l[c].cutOff ? this.cutOffPath(a, l[c].cutOff) : a;
                this.setAttr(b, a)
            }, fillSetter: function (a, b, c) {
                var l = c.nodeName;
                "SPAN" === l ? c.style.color = a : "IMG" !== l && (c.filled = "none" !== a, this.setAttr("fillcolor", this.renderer.color(a, c, b, this)))
            }, "fill-opacitySetter": function (a, b, c) {
                G(this.renderer.prepVML(["\x3c", b.split("-")[0], ' opacity\x3d"', a, '"/\x3e']), null, null, c)
            }, opacitySetter: A, rotationSetter: function (a, b, c) {
                c =
                    c.style;
                this[b] = c[b] = a;
                c.left = -Math.round(Math.sin(a * g) + 1) + "px";
                c.top = Math.round(Math.cos(a * g)) + "px"
            }, strokeSetter: function (a, b, c) {
                this.setAttr("strokecolor", this.renderer.color(a, c, b, this))
            }, "stroke-widthSetter": function (a, b, c) {
                c.stroked = !!a;
                this[b] = a;
                n(a) && (a += "px");
                this.setAttr("strokeweight", a)
            }, titleSetter: function (a, b) {
                this.setAttr(b, a)
            }, visibilitySetter: function (a, b, c) {
                "inherit" === a && (a = "visible");
                this.shadows && v(this.shadows, function (c) {
                    c.style[b] = a
                });
                "DIV" === c.nodeName && (a = "hidden" === a ? "-999em" :
                    0, this.docMode8 || (c.style[b] = a ? "visible" : "hidden"), b = "top");
                c.style[b] = a
            }, xSetter: function (a, b, c) {
                this[b] = a;
                "x" === b ? b = "left" : "y" === b && (b = "top");
                this.updateClipping ? (this[b] = a, this.updateClipping()) : c.style[b] = a
            }, zIndexSetter: function (a, b, c) {
                c.style[b] = a
            }
        }, A["stroke-opacitySetter"] = A["fill-opacitySetter"], a.VMLElement = A = C(y, A), A.prototype.ySetter = A.prototype.widthSetter = A.prototype.heightSetter = A.prototype.xSetter, A = {
            Element: A, isIE8: -1 < H.navigator.userAgent.indexOf("MSIE 8.0"), init: function (a, b, c) {
                var l,
                    d;
                this.alignedObjects = [];
                l = this.createElement("div").css({position: "relative"});
                d = l.element;
                a.appendChild(l.element);
                this.isVML = !0;
                this.box = d;
                this.boxWrapper = l;
                this.gradients = {};
                this.cache = {};
                this.cacheKeys = [];
                this.imgCount = 0;
                this.setSize(b, c, !1);
                if (!q.namespaces.hcv) {
                    q.namespaces.add("hcv", "urn:schemas-microsoft-com:vml");
                    try {
                        q.createStyleSheet().cssText = "hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "
                    } catch (p) {
                        q.styleSheets[0].cssText += "hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "
                    }
                }
            },
            isHidden: function () {
                return !this.box.offsetWidth
            }, clipRect: function (a, b, c, e) {
                var l = this.createElement(), p = d(a);
                return h(l, {
                    members: [],
                    count: 0,
                    left: (p ? a.x : a) + 1,
                    top: (p ? a.y : b) + 1,
                    width: (p ? a.width : c) - 1,
                    height: (p ? a.height : e) - 1,
                    getCSS: function (a) {
                        var b = a.element, c = b.nodeName, f = a.inverted, t = this.top - ("shape" === c ? b.offsetTop : 0), l = this.left, b = l + this.width, p = t + this.height, t = {clip: "rect(" + Math.round(f ? l : t) + "px," + Math.round(f ? p : b) + "px," + Math.round(f ? b : p) + "px," + Math.round(f ? t : l) + "px)"};
                        !f && a.docMode8 && "DIV" === c &&
                        h(t, {width: b + "px", height: p + "px"});
                        return t
                    },
                    updateClipping: function () {
                        v(l.members, function (a) {
                            a.element && a.css(l.getCSS(a))
                        })
                    }
                })
            }, color: function (b, c, d, e) {
                var l = this, p, r = /^rgba/, h, n, f = "none";
                b && b.linearGradient ? n = "gradient" : b && b.radialGradient && (n = "pattern");
                if (n) {
                    var t, y, w = b.linearGradient || b.radialGradient, g, q, B, x, D, z = "";
                    b = b.stops;
                    var k, m = [], u = function () {
                        h = ['\x3cfill colors\x3d"' + m.join(",") + '" opacity\x3d"', B, '" o:opacity2\x3d"', q, '" type\x3d"', n, '" ', z, 'focus\x3d"100%" method\x3d"any" /\x3e'];
                        G(l.prepVML(h), null, null, c)
                    };
                    g = b[0];
                    k = b[b.length - 1];
                    0 < g[0] && b.unshift([0, g[1]]);
                    1 > k[0] && b.push([1, k[1]]);
                    v(b, function (f, b) {
                        r.test(f[1]) ? (p = a.color(f[1]), t = p.get("rgb"), y = p.get("a")) : (t = f[1], y = 1);
                        m.push(100 * f[0] + "% " + t);
                        b ? (B = y, x = t) : (q = y, D = t)
                    });
                    if ("fill" === d)if ("gradient" === n)d = w.x1 || w[0] || 0, b = w.y1 || w[1] || 0, g = w.x2 || w[2] || 0, w = w.y2 || w[3] || 0, z = 'angle\x3d"' + (90 - 180 * Math.atan((w - b) / (g - d)) / Math.PI) + '"', u(); else {
                        var f = w.r, H = 2 * f, A = 2 * f, C = w.cx, F = w.cy, T = c.radialReference, K, f = function () {
                            T && (K = e.getBBox(), C += (T[0] -
                                K.x) / K.width - .5, F += (T[1] - K.y) / K.height - .5, H *= T[2] / K.width, A *= T[2] / K.height);
                            z = 'src\x3d"' + a.getOptions().global.VMLRadialGradientURL + '" size\x3d"' + H + "," + A + '" origin\x3d"0.5,0.5" position\x3d"' + C + "," + F + '" color2\x3d"' + D + '" ';
                            u()
                        };
                        e.added ? f() : e.onAdd = f;
                        f = x
                    } else f = t
                } else r.test(b) && "IMG" !== c.tagName ? (p = a.color(b), e[d + "-opacitySetter"](p.get("a"), d, c), f = p.get("rgb")) : (f = c.getElementsByTagName(d), f.length && (f[0].opacity = 1, f[0].type = "solid"), f = b);
                return f
            }, prepVML: function (a) {
                var b = this.isIE8;
                a = a.join("");
                b ? (a = a.replace("/\x3e", ' xmlns\x3d"urn:schemas-microsoft-com:vml" /\x3e'), a = -1 === a.indexOf('style\x3d"') ? a.replace("/\x3e", ' style\x3d"display:inline-block;behavior:url(#default#VML);" /\x3e') : a.replace('style\x3d"', 'style\x3d"display:inline-block;behavior:url(#default#VML);')) : a = a.replace("\x3c", "\x3chcv:");
                return a
            }, text: D.prototype.html, path: function (a) {
                var b = {coordsize: "10 10"};
                e(a) ? b.d = a : d(a) && h(b, a);
                return this.createElement("shape").attr(b)
            }, circle: function (a, b, c) {
                var l = this.symbol("circle");
                d(a) && (c = a.r, b = a.y, a = a.x);
                l.isCircle = !0;
                l.r = c;
                return l.attr({x: a, y: b})
            }, g: function (a) {
                var b;
                a && (b = {className: "highcharts-" + a, "class": "highcharts-" + a});
                return this.createElement("div").attr(b)
            }, image: function (a, b, c, d, e) {
                var l = this.createElement("img").attr({src: a});
                1 < arguments.length && l.attr({x: b, y: c, width: d, height: e});
                return l
            }, createElement: function (a) {
                return "rect" === a ? this.symbol(a) : D.prototype.createElement.call(this, a)
            }, invertChild: function (a, c) {
                var d = this;
                c = c.style;
                var l = "IMG" === a.tagName && a.style;
                F(a, {
                    flip: "x",
                    left: b(c.width) - (l ? b(l.top) : 1),
                    top: b(c.height) - (l ? b(l.left) : 1),
                    rotation: -90
                });
                v(a.childNodes, function (b) {
                    d.invertChild(b, a)
                })
            }, symbols: {
                arc: function (a, b, c, d, e) {
                    var p = e.start, l = e.end, r = e.r || c || d;
                    c = e.innerR;
                    d = Math.cos(p);
                    var h = Math.sin(p), f = Math.cos(l), t = Math.sin(l);
                    if (0 === l - p)return ["x"];
                    p = ["wa", a - r, b - r, a + r, b + r, a + r * d, b + r * h, a + r * f, b + r * t];
                    e.open && !c && p.push("e", "M", a, b);
                    p.push("at", a - c, b - c, a + c, b + c, a + c * f, b + c * t, a + c * d, b + c * h, "x", "e");
                    p.isArc = !0;
                    return p
                }, circle: function (a, b, c, d, e) {
                    e && m(e.r) &&
                    (c = d = 2 * e.r);
                    e && e.isCircle && (a -= c / 2, b -= d / 2);
                    return ["wa", a, b, a + c, b + d, a + c, b + d / 2, a + c, b + d / 2, "e"]
                }, rect: function (a, b, c, d, e) {
                    return D.prototype.symbols[m(e) && e.r ? "callout" : "square"].call(0, a, b, c, d, e)
                }
            }
        }, a.VMLRenderer = C = function () {
            this.init.apply(this, arguments)
        }, C.prototype = c(D.prototype, A), a.Renderer = C);
        D.prototype.measureSpanWidth = function (a, b) {
            var c = q.createElement("span");
            a = q.createTextNode(a);
            c.appendChild(a);
            F(c, b);
            this.box.appendChild(c);
            b = c.offsetWidth;
            k(c);
            return b
        }
    })(K);
    (function (a) {
        function C() {
            var g =
                a.defaultOptions.global, k = q.moment;
            if (g.timezone) {
                if (k)return function (a) {
                    return -k.tz(a, g.timezone).utcOffset()
                };
                a.error(25)
            }
            return g.useUTC && g.getTimezoneOffset
        }

        function A() {
            var g = a.defaultOptions.global, u, h = g.useUTC, e = h ? "getUTC" : "get", n = h ? "setUTC" : "set";
            a.Date = u = g.Date || q.Date;
            u.hcTimezoneOffset = h && g.timezoneOffset;
            u.hcGetTimezoneOffset = C();
            u.hcMakeTime = function (a, c, e, b, n, g) {
                var d;
                h ? (d = u.UTC.apply(0, arguments), d += m(d)) : d = (new u(a, c, k(e, 1), k(b, 0), k(n, 0), k(g, 0))).getTime();
                return d
            };
            F("Minutes Hours Day Date Month FullYear".split(" "),
                function (a) {
                    u["hcGet" + a] = e + a
                });
            F("Milliseconds Seconds Minutes Hours Date Month FullYear".split(" "), function (a) {
                u["hcSet" + a] = n + a
            })
        }

        var G = a.color, F = a.each, m = a.getTZOffset, g = a.merge, k = a.pick, q = a.win;
        a.defaultOptions = {
            colors: "#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1".split(" "),
            symbols: ["circle", "diamond", "square", "triangle", "triangle-down"],
            lang: {
                loading: "Loading...",
                months: "January February March April May June July August September October November December".split(" "),
                shortMonths: "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),
                weekdays: "Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),
                decimalPoint: ".",
                numericSymbols: "kMGTPE".split(""),
                resetZoom: "Reset zoom",
                resetZoomTitle: "Reset zoom level 1:1",
                thousandsSep: " "
            },
            global: {useUTC: !0, VMLRadialGradientURL: "http://code.highcharts.com/5.0.12/gfx/vml-radial-gradient.png"},
            chart: {
                borderRadius: 0,
                defaultSeriesType: "line",
                ignoreHiddenSeries: !0,
                spacing: [10, 10, 15, 10],
                resetZoomButton: {
                    theme: {zIndex: 20},
                    position: {align: "right", x: -10, y: 10}
                },
                width: null,
                height: null,
                borderColor: "#335cad",
                backgroundColor: "#ffffff",
                plotBorderColor: "#cccccc"
            },
            title: {text: "Chart title", align: "center", margin: 15, widthAdjust: -44},
            subtitle: {text: "", align: "center", widthAdjust: -44},
            plotOptions: {},
            labels: {style: {position: "absolute", color: "#e0faff"}},
            legend: {
                enabled: !0,
                align: "center",
                layout: "horizontal",
                labelFormatter: function () {
                    return this.name
                },
                borderColor: "#999999",
                borderRadius: 0,
                navigation: {activeColor: "#003399", inactiveColor: "#cccccc"},
                itemStyle: {color: "#e0faff", fontSize: "12px", fontWeight: "bold", textOverflow: "ellipsis"},
                itemHoverStyle: {color: "#000000"},
                itemHiddenStyle: {color: "#cccccc"},
                shadow: !1,
                itemCheckboxStyle: {position: "absolute", width: "13px", height: "13px"},
                squareSymbol: !0,
                symbolPadding: 5,
                verticalAlign: "bottom",
                x: 0,
                y: 0,
                title: {style: {fontWeight: "bold"}}
            },
            loading: {
                labelStyle: {fontWeight: "bold", position: "relative", top: "45%"},
                style: {position: "absolute", backgroundColor: "#ffffff", opacity: .5, textAlign: "center"}
            },
            tooltip: {
                enabled: !0,
                animation: a.svg,
                borderRadius: 3,
                dateTimeLabelFormats: {
                    millisecond: "%A, %b %e, %H:%M:%S.%L",
                    second: "%A, %b %e, %H:%M:%S",
                    minute: "%A, %b %e, %H:%M",
                    hour: "%A, %b %e, %H:%M",
                    day: "%A, %b %e, %Y",
                    week: "Week from %A, %b %e, %Y",
                    month: "%B %Y",
                    year: "%Y"
                },
                footerFormat: "",
                padding: 8,
                snap: a.isTouchDevice ? 25 : 10,
                backgroundColor: G("#f7f7f7").setOpacity(.85).get(),
                borderWidth: 1,
                headerFormat: '\x3cspan style\x3d"font-size: 10px"\x3e{point.key}\x3c/span\x3e\x3cbr/\x3e',
                pointFormat: '\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e',
                shadow: !0,
                style: {
                    color: "#e0faff",
                    cursor: "default",
                    fontSize: "12px",
                    pointerEvents: "none",
                    whiteSpace: "nowrap"
                }
            },
            credits: {
                enabled: !0,
                href: "http://www.highcharts.com",
                position: {align: "right", x: -10, verticalAlign: "bottom", y: -5},
                style: {cursor: "pointer", color: "#999999", fontSize: "9px"},
                text: "Highcharts.com"
            }
        };
        a.setOptions = function (q) {
            a.defaultOptions = g(!0, a.defaultOptions, q);
            A();
            return a.defaultOptions
        };
        a.getOptions = function () {
            return a.defaultOptions
        };
        a.defaultPlotOptions = a.defaultOptions.plotOptions;
        A()
    })(K);
    (function (a) {
        var C = a.correctFloat, A = a.defined, G = a.destroyObjectProperties, F = a.isNumber, m = a.merge, g = a.pick, k = a.deg2rad;
        a.Tick = function (a, g, k, h) {
            this.axis = a;
            this.pos = g;
            this.type = k || "";
            this.isNewLabel = this.isNew = !0;
            k || h || this.addLabel()
        };
        a.Tick.prototype = {
            addLabel: function () {
                var a = this.axis, k = a.options, u = a.chart, h = a.categories, e = a.names, n = this.pos, d = k.labels, c = a.tickPositions, w = n === c[0], b = n === c[c.length - 1], e = h ? g(h[n], e[n], n) : n, h = this.label, c = c.info, y;
                a.isDatetimeAxis && c && (y = k.dateTimeLabelFormats[c.higherRanks[n] ||
                c.unitName]);
                this.isFirst = w;
                this.isLast = b;
                k = a.labelFormatter.call({
                    axis: a,
                    chart: u,
                    isFirst: w,
                    isLast: b,
                    dateTimeLabelFormat: y,
                    value: a.isLog ? C(a.lin2log(e)) : e
                });
                A(h) ? h && h.attr({text: k}) : (this.labelLength = (this.label = h = A(k) && d.enabled ? u.renderer.text(k, 0, 0, d.useHTML).css(m(d.style)).add(a.labelGroup) : null) && h.getBBox().width, this.rotation = 0)
            }, getLabelSize: function () {
                return this.label ? this.label.getBBox()[this.axis.horiz ? "height" : "width"] : 0
            }, handleOverflow: function (a) {
                var q = this.axis, m = a.x, h = q.chart.chartWidth,
                    e = q.chart.spacing, n = g(q.labelLeft, Math.min(q.pos, e[3])), e = g(q.labelRight, Math.max(q.pos + q.len, h - e[1])), d = this.label, c = this.rotation, w = {
                        left: 0,
                        center: .5,
                        right: 1
                    }[q.labelAlign], b = d.getBBox().width, y = q.getSlotWidth(), D = y, H = 1, l, B = {};
                if (c)0 > c && m - w * b < n ? l = Math.round(m / Math.cos(c * k) - n) : 0 < c && m + w * b > e && (l = Math.round((h - m) / Math.cos(c * k))); else if (h = m + (1 - w) * b, m - w * b < n ? D = a.x + D * (1 - w) - n : h > e && (D = e - a.x + D * w, H = -1), D = Math.min(y, D), D < y && "center" === q.labelAlign && (a.x += H * (y - D - w * (y - Math.min(b, D)))), b > D || q.autoRotation && (d.styles ||
                    {}).width)l = D;
                l && (B.width = l, (q.options.labels.style || {}).textOverflow || (B.textOverflow = "ellipsis"), d.css(B))
            }, getPosition: function (a, g, k, h) {
                var e = this.axis, n = e.chart, d = h && n.oldChartHeight || n.chartHeight;
                return {
                    x: a ? e.translate(g + k, null, null, h) + e.transB : e.left + e.offset + (e.opposite ? (h && n.oldChartWidth || n.chartWidth) - e.right - e.left : 0),
                    y: a ? d - e.bottom + e.offset - (e.opposite ? e.height : 0) : d - e.translate(g + k, null, null, h) - e.transB
                }
            }, getLabelPosition: function (a, g, m, h, e, n, d, c) {
                var w = this.axis, b = w.transA, y = w.reversed,
                    D = w.staggerLines, q = w.tickRotCorr || {x: 0, y: 0}, l = e.y;
                A(l) || (l = 0 === w.side ? m.rotation ? -8 : -m.getBBox().height : 2 === w.side ? q.y + 8 : Math.cos(m.rotation * k) * (q.y - m.getBBox(!1, 0).height / 2));
                a = a + e.x + q.x - (n && h ? n * b * (y ? -1 : 1) : 0);
                g = g + l - (n && !h ? n * b * (y ? 1 : -1) : 0);
                D && (m = d / (c || 1) % D, w.opposite && (m = D - m - 1), g += w.labelOffset / D * m);
                return {x: a, y: Math.round(g)}
            }, getMarkPath: function (a, g, k, h, e, n) {
                return n.crispLine(["M", a, g, "L", a + (e ? 0 : -k), g + (e ? k : 0)], h)
            }, renderGridLine: function (a, g, k) {
                var h = this.axis, e = h.options, n = this.gridLine, d = {},
                    c = this.pos, w = this.type, b = h.tickmarkOffset, y = h.chart.renderer, D = w ? w + "Grid" : "grid", q = e[D + "LineWidth"], l = e[D + "LineColor"], e = e[D + "LineDashStyle"];
                n || (d.stroke = l, d["stroke-width"] = q, e && (d.dashstyle = e), w || (d.zIndex = 1), a && (d.opacity = 0), this.gridLine = n = y.path().attr(d).addClass("highcharts-" + (w ? w + "-" : "") + "grid-line").add(h.gridGroup));
                if (!a && n && (a = h.getPlotLinePath(c + b, n.strokeWidth() * k, a, !0)))n[this.isNew ? "attr" : "animate"]({
                    d: a,
                    opacity: g
                })
            }, renderMark: function (a, k, m) {
                var h = this.axis, e = h.options, n = h.chart.renderer,
                    d = this.type, c = d ? d + "Tick" : "tick", w = h.tickSize(c), b = this.mark, y = !b, D = a.x;
                a = a.y;
                var q = g(e[c + "Width"], !d && h.isXAxis ? 1 : 0), e = e[c + "Color"];
                w && (h.opposite && (w[0] = -w[0]), y && (this.mark = b = n.path().addClass("highcharts-" + (d ? d + "-" : "") + "tick").add(h.axisGroup), b.attr({
                    stroke: e,
                    "stroke-width": q
                })), b[y ? "attr" : "animate"]({
                    d: this.getMarkPath(D, a, w[0], b.strokeWidth() * m, h.horiz, n),
                    opacity: k
                }))
            }, renderLabel: function (a, k, m, h) {
                var e = this.axis, n = e.horiz, d = e.options, c = this.label, w = d.labels, b = w.step, y = e.tickmarkOffset, D = !0,
                    q = a.x;
                a = a.y;
                c && F(q) && (c.xy = a = this.getLabelPosition(q, a, c, n, w, y, h, b), this.isFirst && !this.isLast && !g(d.showFirstLabel, 1) || this.isLast && !this.isFirst && !g(d.showLastLabel, 1) ? D = !1 : !n || e.isRadial || w.step || w.rotation || k || 0 === m || this.handleOverflow(a), b && h % b && (D = !1), D && F(a.y) ? (a.opacity = m, c[this.isNewLabel ? "attr" : "animate"](a), this.isNewLabel = !1) : (c.attr("y", -9999), this.isNewLabel = !0), this.isNew = !1)
            }, render: function (a, k, m) {
                var h = this.axis, e = h.horiz, n = this.getPosition(e, this.pos, h.tickmarkOffset, k), d = n.x,
                    c = n.y, h = e && d === h.pos + h.len || !e && c === h.pos ? -1 : 1;
                m = g(m, 1);
                this.isActive = !0;
                this.renderGridLine(k, m, h);
                this.renderMark(n, m, h);
                this.renderLabel(n, k, m, a)
            }, destroy: function () {
                G(this, this.axis)
            }
        }
    })(K);
    var S = function (a) {
        var C = a.addEvent, A = a.animObject, G = a.arrayMax, F = a.arrayMin, m = a.color, g = a.correctFloat, k = a.defaultOptions, q = a.defined, v = a.deg2rad, u = a.destroyObjectProperties, h = a.each, e = a.extend, n = a.fireEvent, d = a.format, c = a.getMagnitude, w = a.grep, b = a.inArray, y = a.isArray, D = a.isNumber, H = a.isString, l = a.merge, B =
            a.normalizeTickInterval, r = a.objectEach, z = a.pick, M = a.removeEvent, p = a.splat, E = a.syncTimeout, I = a.Tick, L = function () {
            this.init.apply(this, arguments)
        };
        a.extend(L.prototype, {
            defaultOptions: {
                dateTimeLabelFormats: {
                    millisecond: "%H:%M:%S.%L",
                    second: "%H:%M:%S",
                    minute: "%H:%M",
                    hour: "%H:%M",
                    day: "%e. %b",
                    week: "%e. %b",
                    month: "%b '%y",
                    year: "%Y"
                },
                endOnTick: !1,
                labels: {enabled: !0, style: {color: "#e0faff", cursor: "default", fontSize: "11px"}, x: 0},
                minPadding: .01,
                maxPadding: .01,
                minorTickLength: 2,
                minorTickPosition: "outside",
                startOfWeek: 1,
                startOnTick: !1,
                tickLength: 10,
                tickmarkPlacement: "between",
                tickPixelInterval: 100,
                tickPosition: "outside",
                title: {align: "middle", style: {color: "#e0faff"}},
                type: "linear",
                minorGridLineColor: "#f2f2f2",
                minorGridLineWidth: 1,
                minorTickColor: "#999999",
                lineColor: "#ccd6eb",
                lineWidth: 1,
                gridLineColor: "#e6e6e6",
                tickColor: "#ccd6eb"
            },
            defaultYAxisOptions: {
                endOnTick: !0,
                tickPixelInterval: 72,
                showLastLabel: !0,
                labels: {x: -8},
                maxPadding: .05,
                minPadding: .05,
                startOnTick: !0,
                title: {rotation: 270, text: "Values"},
                stackLabels: {
                    enabled: !1,
                    formatter: function () {
                        return a.numberFormat(this.total, -1)
                    }, style: {fontSize: "11px", fontWeight: "bold", color: "#000000", textOutline: "1px contrast"}
                },
                gridLineWidth: 1,
                lineWidth: 0
            },
            defaultLeftAxisOptions: {labels: {x: -15}, title: {rotation: 270}},
            defaultRightAxisOptions: {labels: {x: 15}, title: {rotation: 90}},
            defaultBottomAxisOptions: {labels: {autoRotation: [-45], x: 0}, title: {rotation: 0}},
            defaultTopAxisOptions: {labels: {autoRotation: [-45], x: 0}, title: {rotation: 0}},
            init: function (a, t) {
                var f = t.isX, c = this;
                c.chart = a;
                c.horiz =
                    a.inverted && !c.isZAxis ? !f : f;
                c.isXAxis = f;
                c.coll = c.coll || (f ? "xAxis" : "yAxis");
                c.opposite = t.opposite;
                c.side = t.side || (c.horiz ? c.opposite ? 0 : 2 : c.opposite ? 1 : 3);
                c.setOptions(t);
                var d = this.options, e = d.type;
                c.labelFormatter = d.labels.formatter || c.defaultLabelFormatter;
                c.userOptions = t;
                c.minPixelPadding = 0;
                c.reversed = d.reversed;
                c.visible = !1 !== d.visible;
                c.zoomEnabled = !1 !== d.zoomEnabled;
                c.hasNames = "category" === e || !0 === d.categories;
                c.categories = d.categories || c.hasNames;
                c.names = c.names || [];
                c.plotLinesAndBandsGroups =
                {};
                c.isLog = "logarithmic" === e;
                c.isDatetimeAxis = "datetime" === e;
                c.positiveValuesOnly = c.isLog && !c.allowNegativeLog;
                c.isLinked = q(d.linkedTo);
                c.ticks = {};
                c.labelEdge = [];
                c.minorTicks = {};
                c.plotLinesAndBands = [];
                c.alternateBands = {};
                c.len = 0;
                c.minRange = c.userMinRange = d.minRange || d.maxZoom;
                c.range = d.range;
                c.offset = d.offset || 0;
                c.stacks = {};
                c.oldStacks = {};
                c.stacksTouched = 0;
                c.max = null;
                c.min = null;
                c.crosshair = z(d.crosshair, p(a.options.tooltip.crosshairs)[f ? 0 : 1], !1);
                t = c.options.events;
                -1 === b(c, a.axes) && (f ? a.axes.splice(a.xAxis.length,
                    0, c) : a.axes.push(c), a[c.coll].push(c));
                c.series = c.series || [];
                a.inverted && !c.isZAxis && f && void 0 === c.reversed && (c.reversed = !0);
                r(t, function (a, f) {
                    C(c, f, a)
                });
                c.lin2log = d.linearToLogConverter || c.lin2log;
                c.isLog && (c.val2lin = c.log2lin, c.lin2val = c.lin2log)
            },
            setOptions: function (a) {
                this.options = l(this.defaultOptions, "yAxis" === this.coll && this.defaultYAxisOptions, [this.defaultTopAxisOptions, this.defaultRightAxisOptions, this.defaultBottomAxisOptions, this.defaultLeftAxisOptions][this.side], l(k[this.coll], a))
            },
            defaultLabelFormatter: function () {
                var f = this.axis, b = this.value, c = f.categories, p = this.dateTimeLabelFormat, e = k.lang, l = e.numericSymbols, e = e.numericSymbolMagnitude || 1E3, r = l && l.length, x, h = f.options.labels.format, f = f.isLog ? Math.abs(b) : f.tickInterval;
                if (h)x = d(h, this); else if (c)x = b; else if (p)x = a.dateFormat(p, b); else if (r && 1E3 <= f)for (; r-- && void 0 === x;)c = Math.pow(e, r + 1), f >= c && 0 === 10 * b % c && null !== l[r] && 0 !== b && (x = a.numberFormat(b / c, -1) + l[r]);
                void 0 === x && (x = 1E4 <= Math.abs(b) ? a.numberFormat(b, -1) : a.numberFormat(b,
                    -1, void 0, ""));
                return x
            },
            getSeriesExtremes: function () {
                var a = this, b = a.chart;
                a.hasVisibleSeries = !1;
                a.dataMin = a.dataMax = a.threshold = null;
                a.softThreshold = !a.isXAxis;
                a.buildStacks && a.buildStacks();
                h(a.series, function (f) {
                    if (f.visible || !b.options.chart.ignoreHiddenSeries) {
                        var c = f.options, t = c.threshold, d;
                        a.hasVisibleSeries = !0;
                        a.positiveValuesOnly && 0 >= t && (t = null);
                        if (a.isXAxis)c = f.xData, c.length && (f = F(c), D(f) || f instanceof Date || (c = w(c, function (a) {
                            return D(a)
                        }), f = F(c)), a.dataMin = Math.min(z(a.dataMin, c[0]),
                            f), a.dataMax = Math.max(z(a.dataMax, c[0]), G(c))); else if (f.getExtremes(), d = f.dataMax, f = f.dataMin, q(f) && q(d) && (a.dataMin = Math.min(z(a.dataMin, f), f), a.dataMax = Math.max(z(a.dataMax, d), d)), q(t) && (a.threshold = t), !c.softThreshold || a.positiveValuesOnly)a.softThreshold = !1
                    }
                })
            },
            translate: function (a, b, c, d, p, e) {
                var f = this.linkedParent || this, t = 1, l = 0, r = d ? f.oldTransA : f.transA;
                d = d ? f.oldMin : f.min;
                var h = f.minPixelPadding;
                p = (f.isOrdinal || f.isBroken || f.isLog && p) && f.lin2val;
                r || (r = f.transA);
                c && (t *= -1, l = f.len);
                f.reversed &&
                (t *= -1, l -= t * (f.sector || f.len));
                b ? (a = (a * t + l - h) / r + d, p && (a = f.lin2val(a))) : (p && (a = f.val2lin(a)), a = t * (a - d) * r + l + t * h + (D(e) ? r * e : 0));
                return a
            },
            toPixels: function (a, b) {
                return this.translate(a, !1, !this.horiz, null, !0) + (b ? 0 : this.pos)
            },
            toValue: function (a, b) {
                return this.translate(a - (b ? 0 : this.pos), !0, !this.horiz, null, !0)
            },
            getPlotLinePath: function (a, b, c, d, p) {
                var f = this.chart, t = this.left, e = this.top, l, r, h = c && f.oldChartHeight || f.chartHeight, n = c && f.oldChartWidth || f.chartWidth, w;
                l = this.transB;
                var g = function (a, f, b) {
                    if (a <
                        f || a > b)d ? a = Math.min(Math.max(f, a), b) : w = !0;
                    return a
                };
                p = z(p, this.translate(a, null, null, c));
                a = c = Math.round(p + l);
                l = r = Math.round(h - p - l);
                D(p) ? this.horiz ? (l = e, r = h - this.bottom, a = c = g(a, t, t + this.width)) : (a = t, c = n - this.right, l = r = g(l, e, e + this.height)) : w = !0;
                return w && !d ? null : f.renderer.crispLine(["M", a, l, "L", c, r], b || 1)
            },
            getLinearTickPositions: function (a, b, c) {
                var f, t = g(Math.floor(b / a) * a);
                c = g(Math.ceil(c / a) * a);
                var d = [];
                if (this.single)return [b];
                for (b = t; b <= c;) {
                    d.push(b);
                    b = g(b + a);
                    if (b === f)break;
                    f = b
                }
                return d
            },
            getMinorTickPositions: function () {
                var a =
                    this, b = a.options, c = a.tickPositions, d = a.minorTickInterval, p = [], e = a.pointRangePadding || 0, l = a.min - e, e = a.max + e, x = e - l;
                if (x && x / d < a.len / 3)if (a.isLog)h(this.paddedTicks, function (b, f, c) {
                    f && p.push.apply(p, a.getLogTickPositions(d, c[f - 1], c[f], !0))
                }); else if (a.isDatetimeAxis && "auto" === b.minorTickInterval)p = p.concat(a.getTimeTicks(a.normalizeTimeTickInterval(d), l, e, b.startOfWeek)); else for (b = l + (c[0] - l) % d; b <= e && b !== p[0]; b += d)p.push(b);
                0 !== p.length && a.trimTicks(p);
                return p
            },
            adjustForMinRange: function () {
                var a = this.options,
                    b = this.min, c = this.max, d, p, e, l, x, r, n, w;
                this.isXAxis && void 0 === this.minRange && !this.isLog && (q(a.min) || q(a.max) ? this.minRange = null : (h(this.series, function (a) {
                    r = a.xData;
                    for (l = n = a.xIncrement ? 1 : r.length - 1; 0 < l; l--)if (x = r[l] - r[l - 1], void 0 === e || x < e)e = x
                }), this.minRange = Math.min(5 * e, this.dataMax - this.dataMin)));
                c - b < this.minRange && (p = this.dataMax - this.dataMin >= this.minRange, w = this.minRange, d = (w - c + b) / 2, d = [b - d, z(a.min, b - d)], p && (d[2] = this.isLog ? this.log2lin(this.dataMin) : this.dataMin), b = G(d), c = [b + w, z(a.max, b + w)],
                p && (c[2] = this.isLog ? this.log2lin(this.dataMax) : this.dataMax), c = F(c), c - b < w && (d[0] = c - w, d[1] = z(a.min, c - w), b = G(d)));
                this.min = b;
                this.max = c
            },
            getClosest: function () {
                var a;
                this.categories ? a = 1 : h(this.series, function (b) {
                    var f = b.closestPointRange, c = b.visible || !b.chart.options.chart.ignoreHiddenSeries;
                    !b.noSharedTooltip && q(f) && c && (a = q(a) ? Math.min(a, f) : f)
                });
                return a
            },
            nameToX: function (a) {
                var f = y(this.categories), c = f ? this.categories : this.names, d = a.options.x, p;
                a.series.requireSorting = !1;
                q(d) || (d = !1 === this.options.uniqueNames ?
                    a.series.autoIncrement() : b(a.name, c));
                -1 === d ? f || (p = c.length) : p = d;
                void 0 !== p && (this.names[p] = a.name);
                return p
            },
            updateNames: function () {
                var a = this;
                0 < this.names.length && (this.names.length = 0, this.minRange = this.userMinRange, h(this.series || [], function (b) {
                    b.xIncrement = null;
                    if (!b.points || b.isDirtyData)b.processData(), b.generatePoints();
                    h(b.points, function (f, c) {
                        var t;
                        f.options && (t = a.nameToX(f), void 0 !== t && t !== f.x && (f.x = t, b.xData[c] = t))
                    })
                }))
            },
            setAxisTranslation: function (a) {
                var b = this, f = b.max - b.min, c = b.axisPointRange ||
                    0, d, p = 0, e = 0, l = b.linkedParent, r = !!b.categories, n = b.transA, w = b.isXAxis;
                if (w || r || c)d = b.getClosest(), l ? (p = l.minPointOffset, e = l.pointRangePadding) : h(b.series, function (a) {
                    var f = r ? 1 : w ? z(a.options.pointRange, d, 0) : b.axisPointRange || 0;
                    a = a.options.pointPlacement;
                    c = Math.max(c, f);
                    b.single || (p = Math.max(p, H(a) ? 0 : f / 2), e = Math.max(e, "on" === a ? 0 : f))
                }), l = b.ordinalSlope && d ? b.ordinalSlope / d : 1, b.minPointOffset = p *= l, b.pointRangePadding = e *= l, b.pointRange = Math.min(c, f), w && (b.closestPointRange = d);
                a && (b.oldTransA = n);
                b.translationSlope =
                    b.transA = n = b.options.staticScale || b.len / (f + e || 1);
                b.transB = b.horiz ? b.left : b.bottom;
                b.minPixelPadding = n * p
            },
            minFromRange: function () {
                return this.max - this.range
            },
            setTickInterval: function (b) {
                var f = this, d = f.chart, p = f.options, e = f.isLog, l = f.log2lin, r = f.isDatetimeAxis, x = f.isXAxis, w = f.isLinked, y = p.maxPadding, E = p.minPadding, k = p.tickInterval, I = p.tickPixelInterval, m = f.categories, H = f.threshold, u = f.softThreshold, L, v, M, A;
                r || m || w || this.getTickAmount();
                M = z(f.userMin, p.min);
                A = z(f.userMax, p.max);
                w ? (f.linkedParent = d[f.coll][p.linkedTo],
                    d = f.linkedParent.getExtremes(), f.min = z(d.min, d.dataMin), f.max = z(d.max, d.dataMax), p.type !== f.linkedParent.options.type && a.error(11, 1)) : (!u && q(H) && (f.dataMin >= H ? (L = H, E = 0) : f.dataMax <= H && (v = H, y = 0)), f.min = z(M, L, f.dataMin), f.max = z(A, v, f.dataMax));
                e && (f.positiveValuesOnly && !b && 0 >= Math.min(f.min, z(f.dataMin, f.min)) && a.error(10, 1), f.min = g(l(f.min), 15), f.max = g(l(f.max), 15));
                f.range && q(f.max) && (f.userMin = f.min = M = Math.max(f.min, f.minFromRange()), f.userMax = A = f.max, f.range = null);
                n(f, "foundExtremes");
                f.beforePadding &&
                f.beforePadding();
                f.adjustForMinRange();
                !(m || f.axisPointRange || f.usePercentage || w) && q(f.min) && q(f.max) && (l = f.max - f.min) && (!q(M) && E && (f.min -= l * E), !q(A) && y && (f.max += l * y));
                D(p.softMin) && (f.min = Math.min(f.min, p.softMin));
                D(p.softMax) && (f.max = Math.max(f.max, p.softMax));
                D(p.floor) && (f.min = Math.max(f.min, p.floor));
                D(p.ceiling) && (f.max = Math.min(f.max, p.ceiling));
                u && q(f.dataMin) && (H = H || 0, !q(M) && f.min < H && f.dataMin >= H ? f.min = H : !q(A) && f.max > H && f.dataMax <= H && (f.max = H));
                f.tickInterval = f.min === f.max || void 0 === f.min ||
                void 0 === f.max ? 1 : w && !k && I === f.linkedParent.options.tickPixelInterval ? k = f.linkedParent.tickInterval : z(k, this.tickAmount ? (f.max - f.min) / Math.max(this.tickAmount - 1, 1) : void 0, m ? 1 : (f.max - f.min) * I / Math.max(f.len, I));
                x && !b && h(f.series, function (a) {
                    a.processData(f.min !== f.oldMin || f.max !== f.oldMax)
                });
                f.setAxisTranslation(!0);
                f.beforeSetTickPositions && f.beforeSetTickPositions();
                f.postProcessTickInterval && (f.tickInterval = f.postProcessTickInterval(f.tickInterval));
                f.pointRange && !k && (f.tickInterval = Math.max(f.pointRange,
                    f.tickInterval));
                b = z(p.minTickInterval, f.isDatetimeAxis && f.closestPointRange);
                !k && f.tickInterval < b && (f.tickInterval = b);
                r || e || k || (f.tickInterval = B(f.tickInterval, null, c(f.tickInterval), z(p.allowDecimals, !(.5 < f.tickInterval && 5 > f.tickInterval && 1E3 < f.max && 9999 > f.max)), !!this.tickAmount));
                this.tickAmount || (f.tickInterval = f.unsquish());
                this.setTickPositions()
            },
            setTickPositions: function () {
                var a = this.options, b, c = a.tickPositions, d = a.tickPositioner, p = a.startOnTick, l = a.endOnTick;
                this.tickmarkOffset = this.categories &&
                "between" === a.tickmarkPlacement && 1 === this.tickInterval ? .5 : 0;
                this.minorTickInterval = "auto" === a.minorTickInterval && this.tickInterval ? this.tickInterval / 5 : a.minorTickInterval;
                this.single = this.min === this.max && q(this.min) && !this.tickAmount && (parseInt(this.min, 10) === this.min || !1 !== a.allowDecimals);
                this.tickPositions = b = c && c.slice();
                !b && (b = this.isDatetimeAxis ? this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval, a.units), this.min, this.max, a.startOfWeek, this.ordinalPositions, this.closestPointRange,
                    !0) : this.isLog ? this.getLogTickPositions(this.tickInterval, this.min, this.max) : this.getLinearTickPositions(this.tickInterval, this.min, this.max), b.length > this.len && (b = [b[0], b.pop()]), this.tickPositions = b, d && (d = d.apply(this, [this.min, this.max]))) && (this.tickPositions = b = d);
                this.paddedTicks = b.slice(0);
                this.trimTicks(b, p, l);
                this.isLinked || (this.single && (this.min -= .5, this.max += .5), c || d || this.adjustTickAmount())
            },
            trimTicks: function (a, b, c) {
                var f = a[0], d = a[a.length - 1], p = this.minPointOffset || 0;
                if (!this.isLinked) {
                    if (b &&
                        -Infinity !== f)this.min = f; else for (; this.min - p > a[0];)a.shift();
                    if (c)this.max = d; else for (; this.max + p < a[a.length - 1];)a.pop();
                    0 === a.length && q(f) && a.push((d + f) / 2)
                }
            },
            alignToOthers: function () {
                var a = {}, b, c = this.options;
                !1 === this.chart.options.chart.alignTicks || !1 === c.alignTicks || this.isLog || h(this.chart[this.coll], function (f) {
                    var c = f.options, c = [f.horiz ? c.left : c.top, c.width, c.height, c.pane].join();
                    f.series.length && (a[c] ? b = !0 : a[c] = 1)
                });
                return b
            },
            getTickAmount: function () {
                var a = this.options, b = a.tickAmount, c =
                    a.tickPixelInterval;
                !q(a.tickInterval) && this.len < c && !this.isRadial && !this.isLog && a.startOnTick && a.endOnTick && (b = 2);
                !b && this.alignToOthers() && (b = Math.ceil(this.len / c) + 1);
                4 > b && (this.finalTickAmt = b, b = 5);
                this.tickAmount = b
            },
            adjustTickAmount: function () {
                var a = this.tickInterval, b = this.tickPositions, c = this.tickAmount, d = this.finalTickAmt, p = b && b.length;
                if (p < c) {
                    for (; b.length < c;)b.push(g(b[b.length - 1] + a));
                    this.transA *= (p - 1) / (c - 1);
                    this.max = b[b.length - 1]
                } else p > c && (this.tickInterval *= 2, this.setTickPositions());
                if (q(d)) {
                    for (a = c = b.length; a--;)(3 === d && 1 === a % 2 || 2 >= d && 0 < a && a < c - 1) && b.splice(a, 1);
                    this.finalTickAmt = void 0
                }
            },
            setScale: function () {
                var a, b;
                this.oldMin = this.min;
                this.oldMax = this.max;
                this.oldAxisLength = this.len;
                this.setAxisSize();
                b = this.len !== this.oldAxisLength;
                h(this.series, function (b) {
                    if (b.isDirtyData || b.isDirty || b.xAxis.isDirty)a = !0
                });
                b || a || this.isLinked || this.forceRedraw || this.userMin !== this.oldUserMin || this.userMax !== this.oldUserMax || this.alignToOthers() ? (this.resetStacks && this.resetStacks(), this.forceRedraw = !1, this.getSeriesExtremes(), this.setTickInterval(), this.oldUserMin = this.userMin, this.oldUserMax = this.userMax, this.isDirty || (this.isDirty = b || this.min !== this.oldMin || this.max !== this.oldMax)) : this.cleanStacks && this.cleanStacks()
            },
            setExtremes: function (a, b, c, d, p) {
                var f = this, l = f.chart;
                c = z(c, !0);
                h(f.series, function (a) {
                    delete a.kdTree
                });
                p = e(p, {min: a, max: b});
                n(f, "setExtremes", p, function () {
                    f.userMin = a;
                    f.userMax = b;
                    f.eventArgs = p;
                    c && l.redraw(d)
                })
            },
            zoom: function (a, b) {
                var f = this.dataMin, c = this.dataMax, d = this.options,
                    p = Math.min(f, z(d.min, f)), d = Math.max(c, z(d.max, c));
                if (a !== this.min || b !== this.max)this.allowZoomOutside || (q(f) && (a < p && (a = p), a > d && (a = d)), q(c) && (b < p && (b = p), b > d && (b = d))), this.displayBtn = void 0 !== a || void 0 !== b, this.setExtremes(a, b, !1, void 0, {trigger: "zoom"});
                return !0
            },
            setAxisSize: function () {
                var a = this.chart, b = this.options, c = b.offsets || [0, 0, 0, 0], d = this.horiz, p = z(b.width, a.plotWidth - c[3] + c[1]), l = z(b.height, a.plotHeight - c[0] + c[2]), e = z(b.top, a.plotTop + c[0]), b = z(b.left, a.plotLeft + c[3]), c = /%$/;
                c.test(l) && (l =
                    Math.round(parseFloat(l) / 100 * a.plotHeight));
                c.test(e) && (e = Math.round(parseFloat(e) / 100 * a.plotHeight + a.plotTop));
                this.left = b;
                this.top = e;
                this.width = p;
                this.height = l;
                this.bottom = a.chartHeight - l - e;
                this.right = a.chartWidth - p - b;
                this.len = Math.max(d ? p : l, 0);
                this.pos = d ? b : e
            },
            getExtremes: function () {
                var a = this.isLog, b = this.lin2log;
                return {
                    min: a ? g(b(this.min)) : this.min,
                    max: a ? g(b(this.max)) : this.max,
                    dataMin: this.dataMin,
                    dataMax: this.dataMax,
                    userMin: this.userMin,
                    userMax: this.userMax
                }
            },
            getThreshold: function (a) {
                var b =
                    this.isLog, f = this.lin2log, c = b ? f(this.min) : this.min, b = b ? f(this.max) : this.max;
                null === a ? a = c : c > a ? a = c : b < a && (a = b);
                return this.translate(a, 0, 1, 0, 1)
            },
            autoLabelAlign: function (a) {
                a = (z(a, 0) - 90 * this.side + 720) % 360;
                return 15 < a && 165 > a ? "right" : 195 < a && 345 > a ? "left" : "center"
            },
            tickSize: function (a) {
                var b = this.options, f = b[a + "Length"], c = z(b[a + "Width"], "tick" === a && this.isXAxis ? 1 : 0);
                if (c && f)return "inside" === b[a + "Position"] && (f = -f), [f, c]
            },
            labelMetrics: function () {
                var a = this.tickPositions && this.tickPositions[0] || 0;
                return this.chart.renderer.fontMetrics(this.options.labels.style &&
                    this.options.labels.style.fontSize, this.ticks[a] && this.ticks[a].label)
            },
            unsquish: function () {
                var a = this.options.labels, b = this.horiz, c = this.tickInterval, d = c, p = this.len / (((this.categories ? 1 : 0) + this.max - this.min) / c), l, e = a.rotation, r = this.labelMetrics(), n, w = Number.MAX_VALUE, g, y = function (a) {
                    a /= p || 1;
                    a = 1 < a ? Math.ceil(a) : 1;
                    return a * c
                };
                b ? (g = !a.staggerLines && !a.step && (q(e) ? [e] : p < z(a.autoRotationLimit, 80) && a.autoRotation)) && h(g, function (a) {
                    var b;
                    if (a === e || a && -90 <= a && 90 >= a)n = y(Math.abs(r.h / Math.sin(v * a))), b = n +
                        Math.abs(a / 360), b < w && (w = b, l = a, d = n)
                }) : a.step || (d = y(r.h));
                this.autoRotation = g;
                this.labelRotation = z(l, e);
                return d
            },
            getSlotWidth: function () {
                var a = this.chart, b = this.horiz, c = this.options.labels, d = Math.max(this.tickPositions.length - (this.categories ? 0 : 1), 1), p = a.margin[3];
                return b && 2 > (c.step || 0) && !c.rotation && (this.staggerLines || 1) * this.len / d || !b && (p && p - a.spacing[3] || .33 * a.chartWidth)
            },
            renderUnsquish: function () {
                var a = this.chart, b = a.renderer, c = this.tickPositions, d = this.ticks, p = this.options.labels, e = this.horiz,
                    r = this.getSlotWidth(), x = Math.max(1, Math.round(r - 2 * (p.padding || 5))), n = {}, w = this.labelMetrics(), g = p.style && p.style.textOverflow, y, E = 0, k, I;
                H(p.rotation) || (n.rotation = p.rotation || 0);
                h(c, function (a) {
                    (a = d[a]) && a.labelLength > E && (E = a.labelLength)
                });
                this.maxLabelLength = E;
                if (this.autoRotation)E > x && E > w.h ? n.rotation = this.labelRotation : this.labelRotation = 0; else if (r && (y = {width: x + "px"}, !g))for (y.textOverflow = "clip", k = c.length; !e && k--;)if (I = c[k], x = d[I].label)x.styles && "ellipsis" === x.styles.textOverflow ? x.css({textOverflow: "clip"}) :
                d[I].labelLength > r && x.css({width: r + "px"}), x.getBBox().height > this.len / c.length - (w.h - w.f) && (x.specCss = {textOverflow: "ellipsis"});
                n.rotation && (y = {width: (E > .5 * a.chartHeight ? .33 * a.chartHeight : a.chartHeight) + "px"}, g || (y.textOverflow = "ellipsis"));
                if (this.labelAlign = p.align || this.autoLabelAlign(this.labelRotation))n.align = this.labelAlign;
                h(c, function (a) {
                    var b = (a = d[a]) && a.label;
                    b && (b.attr(n), y && b.css(l(y, b.specCss)), delete b.specCss, a.rotation = n.rotation)
                });
                this.tickRotCorr = b.rotCorr(w.b, this.labelRotation ||
                    0, 0 !== this.side)
            },
            hasData: function () {
                return this.hasVisibleSeries || q(this.min) && q(this.max) && !!this.tickPositions
            },
            addTitle: function (a) {
                var b = this.chart.renderer, f = this.horiz, c = this.opposite, d = this.options.title, p;
                this.axisTitle || ((p = d.textAlign) || (p = (f ? {
                    low: "left",
                    middle: "center",
                    high: "right"
                } : {
                    low: c ? "right" : "left",
                    middle: "center",
                    high: c ? "left" : "right"
                })[d.align]), this.axisTitle = b.text(d.text, 0, 0, d.useHTML).attr({
                    zIndex: 7,
                    rotation: d.rotation || 0,
                    align: p
                }).addClass("highcharts-axis-title").css(d.style).add(this.axisGroup),
                    this.axisTitle.isNew = !0);
                this.axisTitle[a ? "show" : "hide"](!0)
            },
            generateTick: function (a) {
                var b = this.ticks;
                b[a] ? b[a].addLabel() : b[a] = new I(this, a)
            },
            getOffset: function () {
                var a = this, b = a.chart, c = b.renderer, d = a.options, p = a.tickPositions, l = a.ticks, e = a.horiz, x = a.side, n = b.inverted && !a.isZAxis ? [1, 0, 3, 2][x] : x, w, g, y = 0, E, k = 0, I = d.title, D = d.labels, m = 0, B = b.axisOffset, b = b.clipOffset, H = [-1, 1, 1, -1][x], u = d.className, L = a.axisParent, v = this.tickSize("tick");
                w = a.hasData();
                a.showAxis = g = w || z(d.showEmpty, !0);
                a.staggerLines =
                    a.horiz && D.staggerLines;
                a.axisGroup || (a.gridGroup = c.g("grid").attr({zIndex: d.gridZIndex || 1}).addClass("highcharts-" + this.coll.toLowerCase() + "-grid " + (u || "")).add(L), a.axisGroup = c.g("axis").attr({zIndex: d.zIndex || 2}).addClass("highcharts-" + this.coll.toLowerCase() + " " + (u || "")).add(L), a.labelGroup = c.g("axis-labels").attr({zIndex: D.zIndex || 7}).addClass("highcharts-" + a.coll.toLowerCase() + "-labels " + (u || "")).add(L));
                w || a.isLinked ? (h(p, function (b, c) {
                    a.generateTick(b, c)
                }), a.renderUnsquish(), !1 === D.reserveSpace ||
                0 !== x && 2 !== x && {
                    1: "left",
                    3: "right"
                }[x] !== a.labelAlign && "center" !== a.labelAlign || h(p, function (a) {
                    m = Math.max(l[a].getLabelSize(), m)
                }), a.staggerLines && (m *= a.staggerLines, a.labelOffset = m * (a.opposite ? -1 : 1))) : r(l, function (a, b) {
                    a.destroy();
                    delete l[b]
                });
                I && I.text && !1 !== I.enabled && (a.addTitle(g), g && !1 !== I.reserveSpace && (a.titleOffset = y = a.axisTitle.getBBox()[e ? "height" : "width"], E = I.offset, k = q(E) ? 0 : z(I.margin, e ? 5 : 10)));
                a.renderLine();
                a.offset = H * z(d.offset, B[x]);
                a.tickRotCorr = a.tickRotCorr || {x: 0, y: 0};
                c = 0 === x ?
                    -a.labelMetrics().h : 2 === x ? a.tickRotCorr.y : 0;
                k = Math.abs(m) + k;
                m && (k = k - c + H * (e ? z(D.y, a.tickRotCorr.y + 8 * H) : D.x));
                a.axisTitleMargin = z(E, k);
                B[x] = Math.max(B[x], a.axisTitleMargin + y + H * a.offset, k, w && p.length && v ? v[0] + H * a.offset : 0);
                p = 2 * Math.floor(a.axisLine.strokeWidth() / 2);
                0 < d.offset && (p -= 2 * d.offset);
                b[n] = Math.max(b[n] || p, p)
            },
            getLinePath: function (a) {
                var b = this.chart, c = this.opposite, f = this.offset, d = this.horiz, p = this.left + (c ? this.width : 0) + f, f = b.chartHeight - this.bottom - (c ? this.height : 0) + f;
                c && (a *= -1);
                return b.renderer.crispLine(["M",
                    d ? this.left : p, d ? f : this.top, "L", d ? b.chartWidth - this.right : p, d ? f : b.chartHeight - this.bottom], a)
            },
            renderLine: function () {
                this.axisLine || (this.axisLine = this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup), this.axisLine.attr({
                    stroke: this.options.lineColor,
                    "stroke-width": this.options.lineWidth,
                    zIndex: 7
                }))
            },
            getTitlePosition: function () {
                var a = this.horiz, b = this.left, c = this.top, d = this.len, p = this.options.title, l = a ? b : c, e = this.opposite, r = this.offset, h = p.x || 0, n = p.y || 0, w = this.chart.renderer.fontMetrics(p.style &&
                    p.style.fontSize, this.axisTitle).f, d = {
                    low: l + (a ? 0 : d),
                    middle: l + d / 2,
                    high: l + (a ? d : 0)
                }[p.align], b = (a ? c + this.height : b) + (a ? 1 : -1) * (e ? -1 : 1) * this.axisTitleMargin + (2 === this.side ? w : 0);
                return {
                    x: a ? d + h : b + (e ? this.width : 0) + r + h,
                    y: a ? b + n - (e ? this.height : 0) + r : d + n
                }
            },
            renderMinorTick: function (a) {
                var b = this.chart.hasRendered && D(this.oldMin), c = this.minorTicks;
                c[a] || (c[a] = new I(this, a, "minor"));
                b && c[a].isNew && c[a].render(null, !0);
                c[a].render(null, !1, 1)
            },
            renderTick: function (a, b) {
                var c = this.isLinked, f = this.ticks, d = this.chart.hasRendered &&
                    D(this.oldMin);
                if (!c || a >= this.min && a <= this.max)f[a] || (f[a] = new I(this, a)), d && f[a].isNew && f[a].render(b, !0, .1), f[a].render(b)
            },
            render: function () {
                var b = this, c = b.chart, d = b.options, p = b.isLog, l = b.lin2log, e = b.isLinked, n = b.tickPositions, x = b.axisTitle, w = b.ticks, g = b.minorTicks, y = b.alternateBands, k = d.stackLabels, m = d.alternateGridColor, q = b.tickmarkOffset, z = b.axisLine, B = b.showAxis, H = A(c.renderer.globalAnimation), u, L;
                b.labelEdge.length = 0;
                b.overlap = !1;
                h([w, g, y], function (a) {
                    r(a, function (a) {
                        a.isActive = !1
                    })
                });
                if (b.hasData() ||
                    e)b.minorTickInterval && !b.categories && h(b.getMinorTickPositions(), function (a) {
                    b.renderMinorTick(a)
                }), n.length && (h(n, function (a, c) {
                    b.renderTick(a, c)
                }), q && (0 === b.min || b.single) && (w[-1] || (w[-1] = new I(b, -1, null, !0)), w[-1].render(-1))), m && h(n, function (f, d) {
                    L = void 0 !== n[d + 1] ? n[d + 1] + q : b.max - q;
                    0 === d % 2 && f < b.max && L <= b.max + (c.polar ? -q : q) && (y[f] || (y[f] = new a.PlotLineOrBand(b)), u = f + q, y[f].options = {
                        from: p ? l(u) : u,
                        to: p ? l(L) : L,
                        color: m
                    }, y[f].render(), y[f].isActive = !0)
                }), b._addedPlotLB || (h((d.plotLines || []).concat(d.plotBands ||
                    []), function (a) {
                    b.addPlotBandOrLine(a)
                }), b._addedPlotLB = !0);
                h([w, g, y], function (a) {
                    var b, f = [], d = H.duration;
                    r(a, function (a, b) {
                        a.isActive || (a.render(b, !1, 0), a.isActive = !1, f.push(b))
                    });
                    E(function () {
                        for (b = f.length; b--;)a[f[b]] && !a[f[b]].isActive && (a[f[b]].destroy(), delete a[f[b]])
                    }, a !== y && c.hasRendered && d ? d : 0)
                });
                z && (z[z.isPlaced ? "animate" : "attr"]({d: this.getLinePath(z.strokeWidth())}), z.isPlaced = !0, z[B ? "show" : "hide"](!0));
                x && B && (d = b.getTitlePosition(), D(d.y) ? (x[x.isNew ? "attr" : "animate"](d), x.isNew = !1) :
                    (x.attr("y", -9999), x.isNew = !0));
                k && k.enabled && b.renderStackTotals();
                b.isDirty = !1
            },
            redraw: function () {
                this.visible && (this.render(), h(this.plotLinesAndBands, function (a) {
                    a.render()
                }));
                h(this.series, function (a) {
                    a.isDirty = !0
                })
            },
            keepProps: "extKey hcEvents names series userMax userMin".split(" "),
            destroy: function (a) {
                var c = this, f = c.stacks, d = c.plotLinesAndBands, p;
                a || M(c);
                r(f, function (a, b) {
                    u(a);
                    f[b] = null
                });
                h([c.ticks, c.minorTicks, c.alternateBands], function (a) {
                    u(a)
                });
                if (d)for (a = d.length; a--;)d[a].destroy();
                h("stackTotalGroup axisLine axisTitle axisGroup gridGroup labelGroup cross".split(" "),
                    function (a) {
                        c[a] && (c[a] = c[a].destroy())
                    });
                for (p in c.plotLinesAndBandsGroups)c.plotLinesAndBandsGroups[p] = c.plotLinesAndBandsGroups[p].destroy();
                r(c, function (a, f) {
                    -1 === b(f, c.keepProps) && delete c[f]
                })
            },
            drawCrosshair: function (a, b) {
                var c, f = this.crosshair, d = z(f.snap, !0), p, l = this.cross;
                a || (a = this.cross && this.cross.e);
                this.crosshair && !1 !== (q(b) || !d) ? (d ? q(b) && (p = this.isXAxis ? b.plotX : this.len - b.plotY) : p = a && (this.horiz ? a.chartX - this.pos : this.len - a.chartY + this.pos), q(p) && (c = this.getPlotLinePath(b && (this.isXAxis ?
                            b.x : z(b.stackY, b.y)), null, null, null, p) || null), q(c) ? (b = this.categories && !this.isRadial, l || (this.cross = l = this.chart.renderer.path().addClass("highcharts-crosshair highcharts-crosshair-" + (b ? "category " : "thin ") + f.className).attr({zIndex: z(f.zIndex, 2)}).add(), l.attr({
                    stroke: f.color || (b ? m("#ccd6eb").setOpacity(.25).get() : "#cccccc"),
                    "stroke-width": z(f.width, 1)
                }), f.dashStyle && l.attr({dashstyle: f.dashStyle})), l.show().attr({d: c}), b && !f.width && l.attr({"stroke-width": this.transA}), this.cross.e = a) : this.hideCrosshair()) :
                    this.hideCrosshair()
            },
            hideCrosshair: function () {
                this.cross && this.cross.hide()
            }
        });
        return a.Axis = L
    }(K);
    (function (a) {
        var C = a.Axis, A = a.Date, G = a.dateFormat, F = a.defaultOptions, m = a.defined, g = a.each, k = a.extend, q = a.getMagnitude, v = a.getTZOffset, u = a.normalizeTickInterval, h = a.pick, e = a.timeUnits;
        C.prototype.getTimeTicks = function (a, d, c, w) {
            var b = [], n = {}, D = F.global.useUTC, q, l = new A(d - Math.max(v(d), v(c))), B = A.hcMakeTime, r = a.unitRange, z = a.count, u;
            if (m(d)) {
                l[A.hcSetMilliseconds](r >= e.second ? 0 : z * Math.floor(l.getMilliseconds() /
                    z));
                if (r >= e.second)l[A.hcSetSeconds](r >= e.minute ? 0 : z * Math.floor(l.getSeconds() / z));
                if (r >= e.minute)l[A.hcSetMinutes](r >= e.hour ? 0 : z * Math.floor(l[A.hcGetMinutes]() / z));
                if (r >= e.hour)l[A.hcSetHours](r >= e.day ? 0 : z * Math.floor(l[A.hcGetHours]() / z));
                if (r >= e.day)l[A.hcSetDate](r >= e.month ? 1 : z * Math.floor(l[A.hcGetDate]() / z));
                r >= e.month && (l[A.hcSetMonth](r >= e.year ? 0 : z * Math.floor(l[A.hcGetMonth]() / z)), q = l[A.hcGetFullYear]());
                if (r >= e.year)l[A.hcSetFullYear](q - q % z);
                if (r === e.week)l[A.hcSetDate](l[A.hcGetDate]() - l[A.hcGetDay]() +
                    h(w, 1));
                q = l[A.hcGetFullYear]();
                w = l[A.hcGetMonth]();
                var p = l[A.hcGetDate](), E = l[A.hcGetHours]();
                if (A.hcTimezoneOffset || A.hcGetTimezoneOffset)u = (!D || !!A.hcGetTimezoneOffset) && (c - d > 4 * e.month || v(d) !== v(c)), l = l.getTime(), l = new A(l + v(l));
                D = l.getTime();
                for (d = 1; D < c;)b.push(D), D = r === e.year ? B(q + d * z, 0) : r === e.month ? B(q, w + d * z) : !u || r !== e.day && r !== e.week ? u && r === e.hour ? B(q, w, p, E + d * z) : D + r * z : B(q, w, p + d * z * (r === e.day ? 1 : 7)), d++;
                b.push(D);
                r <= e.hour && 1E4 > b.length && g(b, function (a) {
                    0 === a % 18E5 && "000000000" === G("%H%M%S%L", a) &&
                    (n[a] = "day")
                })
            }
            b.info = k(a, {higherRanks: n, totalRange: r * z});
            return b
        };
        C.prototype.normalizeTimeTickInterval = function (a, d) {
            var c = d || [["millisecond", [1, 2, 5, 10, 20, 25, 50, 100, 200, 500]], ["second", [1, 2, 5, 10, 15, 30]], ["minute", [1, 2, 5, 10, 15, 30]], ["hour", [1, 2, 3, 4, 6, 8, 12]], ["day", [1, 2]], ["week", [1, 2]], ["month", [1, 2, 3, 4, 6]], ["year", null]];
            d = c[c.length - 1];
            var h = e[d[0]], b = d[1], n;
            for (n = 0; n < c.length && !(d = c[n], h = e[d[0]], b = d[1], c[n + 1] && a <= (h * b[b.length - 1] + e[c[n + 1][0]]) / 2); n++);
            h === e.year && a < 5 * h && (b = [1, 2, 5]);
            a = u(a / h, b,
                "year" === d[0] ? Math.max(q(a / h), 1) : 1);
            return {unitRange: h, count: a, unitName: d[0]}
        }
    })(K);
    (function (a) {
        var C = a.Axis, A = a.getMagnitude, G = a.map, F = a.normalizeTickInterval, m = a.pick;
        C.prototype.getLogTickPositions = function (a, k, q, v) {
            var g = this.options, h = this.len, e = this.lin2log, n = this.log2lin, d = [];
            v || (this._minorAutoInterval = null);
            if (.5 <= a)a = Math.round(a), d = this.getLinearTickPositions(a, k, q); else if (.08 <= a)for (var h = Math.floor(k), c, w, b, y, D, g = .3 < a ? [1, 2, 4] : .15 < a ? [1, 2, 4, 6, 8] : [1, 2, 3, 4, 5, 6, 7, 8, 9]; h < q + 1 && !D; h++)for (w =
                                                                                                                                                                                                                                                                  g.length, c = 0; c < w && !D; c++)b = n(e(h) * g[c]), b > k && (!v || y <= q) && void 0 !== y && d.push(y), y > q && (D = !0), y = b; else k = e(k), q = e(q), a = g[v ? "minorTickInterval" : "tickInterval"], a = m("auto" === a ? null : a, this._minorAutoInterval, g.tickPixelInterval / (v ? 5 : 1) * (q - k) / ((v ? h / this.tickPositions.length : h) || 1)), a = F(a, null, A(a)), d = G(this.getLinearTickPositions(a, k, q), n), v || (this._minorAutoInterval = a / 5);
            v || (this.tickInterval = a);
            return d
        };
        C.prototype.log2lin = function (a) {
            return Math.log(a) / Math.LN10
        };
        C.prototype.lin2log = function (a) {
            return Math.pow(10,
                a)
        }
    })(K);
    (function (a, C) {
        var A = a.arrayMax, G = a.arrayMin, F = a.defined, m = a.destroyObjectProperties, g = a.each, k = a.erase, q = a.merge, v = a.pick;
        a.PlotLineOrBand = function (a, h) {
            this.axis = a;
            h && (this.options = h, this.id = h.id)
        };
        a.PlotLineOrBand.prototype = {
            render: function () {
                var g = this, h = g.axis, e = h.horiz, n = g.options, d = n.label, c = g.label, w = n.to, b = n.from, y = n.value, k = F(b) && F(w), m = F(y), l = g.svgElem, B = !l, r = [], z = n.color, M = v(n.zIndex, 0), p = n.events, r = {"class": "highcharts-plot-" + (k ? "band " : "line ") + (n.className || "")}, E = {}, I = h.chart.renderer,
                    L = k ? "bands" : "lines", f = h.log2lin;
                h.isLog && (b = f(b), w = f(w), y = f(y));
                m ? (r = {
                    stroke: z,
                    "stroke-width": n.width
                }, n.dashStyle && (r.dashstyle = n.dashStyle)) : k && (z && (r.fill = z), n.borderWidth && (r.stroke = n.borderColor, r["stroke-width"] = n.borderWidth));
                E.zIndex = M;
                L += "-" + M;
                (z = h.plotLinesAndBandsGroups[L]) || (h.plotLinesAndBandsGroups[L] = z = I.g("plot-" + L).attr(E).add());
                B && (g.svgElem = l = I.path().attr(r).add(z));
                if (m)r = h.getPlotLinePath(y, l.strokeWidth()); else if (k)r = h.getPlotBandPath(b, w, n); else return;
                B && r && r.length ? (l.attr({d: r}),
                p && a.objectEach(p, function (a, b) {
                    l.on(b, function (a) {
                        p[b].apply(g, [a])
                    })
                })) : l && (r ? (l.show(), l.animate({d: r})) : (l.hide(), c && (g.label = c = c.destroy())));
                d && F(d.text) && r && r.length && 0 < h.width && 0 < h.height && !r.flat ? (d = q({
                    align: e && k && "center",
                    x: e ? !k && 4 : 10,
                    verticalAlign: !e && k && "middle",
                    y: e ? k ? 16 : 10 : k ? 6 : -4,
                    rotation: e && !k && 90
                }, d), this.renderLabel(d, r, k, M)) : c && c.hide();
                return g
            }, renderLabel: function (a, h, e, n) {
                var d = this.label, c = this.axis.chart.renderer;
                d || (d = {
                    align: a.textAlign || a.align, rotation: a.rotation, "class": "highcharts-plot-" +
                    (e ? "band" : "line") + "-label " + (a.className || "")
                }, d.zIndex = n, this.label = d = c.text(a.text, 0, 0, a.useHTML).attr(d).add(), d.css(a.style));
                n = [h[1], h[4], e ? h[6] : h[1]];
                h = [h[2], h[5], e ? h[7] : h[2]];
                e = G(n);
                c = G(h);
                d.align(a, !1, {x: e, y: c, width: A(n) - e, height: A(h) - c});
                d.show()
            }, destroy: function () {
                k(this.axis.plotLinesAndBands, this);
                delete this.axis;
                m(this)
            }
        };
        a.extend(C.prototype, {
            getPlotBandPath: function (a, h) {
                var e = this.getPlotLinePath(h, null, null, !0), n = this.getPlotLinePath(a, null, null, !0), d = this.horiz, c = 1;
                a = a < this.min &&
                    h < this.min || a > this.max && h > this.max;
                n && e ? (a && (n.flat = n.toString() === e.toString(), c = 0), n.push(d && e[4] === n[4] ? e[4] + c : e[4], d || e[5] !== n[5] ? e[5] : e[5] + c, d && e[1] === n[1] ? e[1] + c : e[1], d || e[2] !== n[2] ? e[2] : e[2] + c)) : n = null;
                return n
            }, addPlotBand: function (a) {
                return this.addPlotBandOrLine(a, "plotBands")
            }, addPlotLine: function (a) {
                return this.addPlotBandOrLine(a, "plotLines")
            }, addPlotBandOrLine: function (g, h) {
                var e = (new a.PlotLineOrBand(this, g)).render(), n = this.userOptions;
                e && (h && (n[h] = n[h] || [], n[h].push(g)), this.plotLinesAndBands.push(e));
                return e
            }, removePlotBandOrLine: function (a) {
                for (var h = this.plotLinesAndBands, e = this.options, n = this.userOptions, d = h.length; d--;)h[d].id === a && h[d].destroy();
                g([e.plotLines || [], n.plotLines || [], e.plotBands || [], n.plotBands || []], function (c) {
                    for (d = c.length; d--;)c[d].id === a && k(c, c[d])
                })
            }, removePlotBand: function (a) {
                this.removePlotBandOrLine(a)
            }, removePlotLine: function (a) {
                this.removePlotBandOrLine(a)
            }
        })
    })(K, S);
    (function (a) {
        var C = a.dateFormat, A = a.each, G = a.extend, F = a.format, m = a.isNumber, g = a.map, k = a.merge, q = a.pick,
            v = a.splat, u = a.syncTimeout, h = a.timeUnits;
        a.Tooltip = function () {
            this.init.apply(this, arguments)
        };
        a.Tooltip.prototype = {
            init: function (a, h) {
                this.chart = a;
                this.options = h;
                this.crosshairs = [];
                this.now = {x: 0, y: 0};
                this.isHidden = !0;
                this.split = h.split && !a.inverted;
                this.shared = h.shared || this.split
            }, cleanSplit: function (a) {
                A(this.chart.series, function (e) {
                    var d = e && e.tt;
                    d && (!d.isActive || a ? e.tt = d.destroy() : d.isActive = !1)
                })
            }, getLabel: function () {
                var a = this.chart.renderer, h = this.options;
                this.label || (this.split ? this.label =
                    a.g("tooltip") : (this.label = a.label("", 0, 0, h.shape || "callout", null, null, h.useHTML, null, "tooltip").attr({
                    padding: h.padding,
                    r: h.borderRadius
                }), this.label.attr({
                    fill: h.backgroundColor,
                    "stroke-width": h.borderWidth
                }).css(h.style).shadow(h.shadow)), this.label.attr({zIndex: 8}).add());
                return this.label
            }, update: function (a) {
                this.destroy();
                k(!0, this.chart.options.tooltip.userOptions, a);
                this.init(this.chart, k(!0, this.options, a))
            }, destroy: function () {
                this.label && (this.label = this.label.destroy());
                this.split && this.tt &&
                (this.cleanSplit(this.chart, !0), this.tt = this.tt.destroy());
                clearTimeout(this.hideTimer);
                clearTimeout(this.tooltipTimeout)
            }, move: function (a, h, d, c) {
                var e = this, b = e.now, n = !1 !== e.options.animation && !e.isHidden && (1 < Math.abs(a - b.x) || 1 < Math.abs(h - b.y)), g = e.followPointer || 1 < e.len;
                G(b, {
                    x: n ? (2 * b.x + a) / 3 : a,
                    y: n ? (b.y + h) / 2 : h,
                    anchorX: g ? void 0 : n ? (2 * b.anchorX + d) / 3 : d,
                    anchorY: g ? void 0 : n ? (b.anchorY + c) / 2 : c
                });
                e.getLabel().attr(b);
                n && (clearTimeout(this.tooltipTimeout), this.tooltipTimeout = setTimeout(function () {
                    e && e.move(a,
                        h, d, c)
                }, 32))
            }, hide: function (a) {
                var e = this;
                clearTimeout(this.hideTimer);
                a = q(a, this.options.hideDelay, 500);
                this.isHidden || (this.hideTimer = u(function () {
                    e.getLabel()[a ? "fadeOut" : "hide"]();
                    e.isHidden = !0
                }, a))
            }, getAnchor: function (a, h) {
                var d, c = this.chart, e = c.inverted, b = c.plotTop, n = c.plotLeft, k = 0, m = 0, l, q;
                a = v(a);
                d = a[0].tooltipPos;
                this.followPointer && h && (void 0 === h.chartX && (h = c.pointer.normalize(h)), d = [h.chartX - c.plotLeft, h.chartY - b]);
                d || (A(a, function (a) {
                    l = a.series.yAxis;
                    q = a.series.xAxis;
                    k += a.plotX + (!e && q ? q.left -
                        n : 0);
                    m += (a.plotLow ? (a.plotLow + a.plotHigh) / 2 : a.plotY) + (!e && l ? l.top - b : 0)
                }), k /= a.length, m /= a.length, d = [e ? c.plotWidth - m : k, this.shared && !e && 1 < a.length && h ? h.chartY - b : e ? c.plotHeight - k : m]);
                return g(d, Math.round)
            }, getPosition: function (a, h, d) {
                var c = this.chart, e = this.distance, b = {}, n = d.h || 0, g, k = ["y", c.chartHeight, h, d.plotY + c.plotTop, c.plotTop, c.plotTop + c.plotHeight], l = ["x", c.chartWidth, a, d.plotX + c.plotLeft, c.plotLeft, c.plotLeft + c.plotWidth], m = !this.followPointer && q(d.ttBelow, !c.inverted === !!d.negative), r = function (a,
                                                                                                                                                                                                                                                                                                                                                    c, d, f, p, l) {
                    var h = d < f - e, r = f + e + d < c, g = f - e - d;
                    f += e;
                    if (m && r)b[a] = f; else if (!m && h)b[a] = g; else if (h)b[a] = Math.min(l - d, 0 > g - n ? g : g - n); else if (r)b[a] = Math.max(p, f + n + d > c ? f : f + n); else return !1
                }, z = function (a, c, d, f) {
                    var p;
                    f < e || f > c - e ? p = !1 : b[a] = f < d / 2 ? 1 : f > c - d / 2 ? c - d - 2 : f - d / 2;
                    return p
                }, v = function (a) {
                    var b = k;
                    k = l;
                    l = b;
                    g = a
                }, p = function () {
                    !1 !== r.apply(0, k) ? !1 !== z.apply(0, l) || g || (v(!0), p()) : g ? b.x = b.y = 0 : (v(!0), p())
                };
                (c.inverted || 1 < this.len) && v();
                p();
                return b
            }, defaultFormatter: function (a) {
                var e = this.points || v(this), d;
                d = [a.tooltipFooterHeaderFormatter(e[0])];
                d = d.concat(a.bodyFormatter(e));
                d.push(a.tooltipFooterHeaderFormatter(e[0], !0));
                return d
            }, refresh: function (a, h) {
                var d, c = this.options, e, b = a, g, n = {}, k = [];
                d = c.formatter || this.defaultFormatter;
                var n = this.shared, l;
                clearTimeout(this.hideTimer);
                this.followPointer = v(b)[0].series.tooltipOptions.followPointer;
                g = this.getAnchor(b, h);
                h = g[0];
                e = g[1];
                !n || b.series && b.series.noSharedTooltip ? n = b.getLabelConfig() : (A(b, function (a) {
                    a.setState("hover");
                    k.push(a.getLabelConfig())
                }), n = {x: b[0].category, y: b[0].y}, n.points = k,
                    b = b[0]);
                this.len = k.length;
                n = d.call(n, this);
                l = b.series;
                this.distance = q(l.tooltipOptions.distance, 16);
                !1 === n ? this.hide() : (d = this.getLabel(), this.isHidden && d.attr({opacity: 1}).show(), this.split ? this.renderSplit(n, a) : (c.style.width || d.css({width: this.chart.spacingBox.width}), d.attr({text: n && n.join ? n.join("") : n}), d.removeClass(/highcharts-color-[\d]+/g).addClass("highcharts-color-" + q(b.colorIndex, l.colorIndex)), d.attr({stroke: c.borderColor || b.color || l.color || "#e0faff"}), this.updatePosition({
                    plotX: h, plotY: e,
                    negative: b.negative, ttBelow: b.ttBelow, h: g[2] || 0
                })), this.isHidden = !1)
            }, renderSplit: function (e, h) {
                var d = this, c = [], g = this.chart, b = g.renderer, n = !0, k = this.options, m, l = this.getLabel();
                A(e.slice(0, h.length + 1), function (a, e) {
                    e = h[e - 1] || {isHeader: !0, plotX: h[0].plotX};
                    var r = e.series || d, w = r.tt, p = e.series || {}, y = "highcharts-color-" + q(e.colorIndex, p.colorIndex, "none");
                    w || (r.tt = w = b.label(null, null, null, "callout").addClass("highcharts-tooltip-box " + y).attr({
                        padding: k.padding, r: k.borderRadius, fill: k.backgroundColor,
                        stroke: e.color || p.color || "#e0faff", "stroke-width": k.borderWidth
                    }).add(l));
                    w.isActive = !0;
                    w.attr({text: a});
                    w.css(k.style);
                    a = w.getBBox();
                    p = a.width + w.strokeWidth();
                    e.isHeader ? (m = a.height, p = Math.max(0, Math.min(e.plotX + g.plotLeft - p / 2, g.chartWidth - p))) : p = e.plotX + g.plotLeft - q(k.distance, 16) - p;
                    0 > p && (n = !1);
                    a = (e.series && e.series.yAxis && e.series.yAxis.pos) + (e.plotY || 0);
                    a -= g.plotTop;
                    c.push({
                        target: e.isHeader ? g.plotHeight + m : a,
                        rank: e.isHeader ? 1 : 0,
                        size: r.tt.getBBox().height + 1,
                        point: e,
                        x: p,
                        tt: w
                    })
                });
                this.cleanSplit();
                a.distribute(c, g.plotHeight + m);
                A(c, function (a) {
                    var b = a.point, c = b.series;
                    a.tt.attr({
                        visibility: void 0 === a.pos ? "hidden" : "inherit",
                        x: n || b.isHeader ? a.x : b.plotX + g.plotLeft + q(k.distance, 16),
                        y: a.pos + g.plotTop,
                        anchorX: b.isHeader ? b.plotX + g.plotLeft : b.plotX + c.xAxis.pos,
                        anchorY: b.isHeader ? a.pos + g.plotTop - 15 : b.plotY + c.yAxis.pos
                    })
                })
            }, updatePosition: function (a) {
                var e = this.chart, d = this.getLabel(), d = (this.options.positioner || this.getPosition).call(this, d.width, d.height, a);
                this.move(Math.round(d.x), Math.round(d.y ||
                    0), a.plotX + e.plotLeft, a.plotY + e.plotTop)
            }, getDateFormat: function (a, g, d, c) {
                var e = C("%m-%d %H:%M:%S.%L", g), b, n, k = {
                    millisecond: 15,
                    second: 12,
                    minute: 9,
                    hour: 6,
                    day: 3
                }, m = "millisecond";
                for (n in h) {
                    if (a === h.week && +C("%w", g) === d && "00:00:00.000" === e.substr(6)) {
                        n = "week";
                        break
                    }
                    if (h[n] > a) {
                        n = m;
                        break
                    }
                    if (k[n] && e.substr(k[n]) !== "01-01 00:00:00.000".substr(k[n]))break;
                    "week" !== n && (m = n)
                }
                n && (b = c[n]);
                return b
            }, getXDateFormat: function (a, h, d) {
                h = h.dateTimeLabelFormats;
                var c = d && d.closestPointRange;
                return (c ? this.getDateFormat(c,
                        a.x, d.options.startOfWeek, h) : h.day) || h.year
            }, tooltipFooterHeaderFormatter: function (a, h) {
                var d = h ? "footer" : "header";
                h = a.series;
                var c = h.tooltipOptions, e = c.xDateFormat, b = h.xAxis, g = b && "datetime" === b.options.type && m(a.key), d = c[d + "Format"];
                g && !e && (e = this.getXDateFormat(a, c, b));
                g && e && (d = d.replace("{point.key}", "{point.key:" + e + "}"));
                return F(d, {point: a, series: h})
            }, bodyFormatter: function (a) {
                return g(a, function (a) {
                    var d = a.series.tooltipOptions;
                    return (d.pointFormatter || a.point.tooltipFormatter).call(a.point,
                        d.pointFormat)
                })
            }
        }
    })(K);
    (function (a) {
        var C = a.addEvent, A = a.attr, G = a.charts, F = a.color, m = a.css, g = a.defined, k = a.doc, q = a.each, v = a.extend, u = a.fireEvent, h = a.offset, e = a.pick, n = a.removeEvent, d = a.splat, c = a.Tooltip, w = a.win;
        a.Pointer = function (a, c) {
            this.init(a, c)
        };
        a.Pointer.prototype = {
            init: function (a, d) {
                this.options = d;
                this.chart = a;
                this.runChartClick = d.chart.events && !!d.chart.events.click;
                this.pinchDown = [];
                this.lastValidTouch = {};
                c && d.tooltip.enabled && (a.tooltip = new c(a, d.tooltip), this.followTouchMove = e(d.tooltip.followTouchMove,
                    !0));
                this.setDOMEvents()
            }, zoomOption: function (a) {
                var b = this.chart, c = b.options.chart, d = c.zoomType || "", b = b.inverted;
                /touch/.test(a.type) && (d = e(c.pinchType, d));
                this.zoomX = a = /x/.test(d);
                this.zoomY = d = /y/.test(d);
                this.zoomHor = a && !b || d && b;
                this.zoomVert = d && !b || a && b;
                this.hasZoom = a || d
            }, normalize: function (a, c) {
                var b, d;
                a = a || w.event;
                a.target || (a.target = a.srcElement);
                d = a.touches ? a.touches.length ? a.touches.item(0) : a.changedTouches[0] : a;
                c || (this.chartPosition = c = h(this.chart.container));
                void 0 === d.pageX ? (b = Math.max(a.x,
                    a.clientX - c.left), c = a.y) : (b = d.pageX - c.left, c = d.pageY - c.top);
                return v(a, {chartX: Math.round(b), chartY: Math.round(c)})
            }, getCoordinates: function (a) {
                var b = {xAxis: [], yAxis: []};
                q(this.chart.axes, function (c) {
                    b[c.isXAxis ? "xAxis" : "yAxis"].push({axis: c, value: c.toValue(a[c.horiz ? "chartX" : "chartY"])})
                });
                return b
            }, getKDPoints: function (a, c, d) {
                var b = [], l, h, r;
                q(a, function (a) {
                    l = a.noSharedTooltip && c;
                    h = !c && a.directTouch;
                    a.visible && !h && e(a.options.enableMouseTracking, !0) && (r = a.searchPoint(d, !l && 0 > a.options.findNearestPointBy.indexOf("y"))) &&
                    r.series && b.push(r)
                });
                b.sort(function (a, b) {
                    var d = a.distX - b.distX, l = a.dist - b.dist, e = (b.series.group && b.series.group.zIndex) - (a.series.group && a.series.group.zIndex);
                    return 0 !== d && c ? d : 0 !== l ? l : 0 !== e ? e : a.series.index > b.series.index ? -1 : 1
                });
                if (c && b[0] && !b[0].series.noSharedTooltip)for (a = b.length; a--;)(b[a].x !== b[0].x || b[a].series.noSharedTooltip) && b.splice(a, 1);
                return b
            }, getPointFromEvent: function (a) {
                a = a.target;
                for (var b; a && !b;)b = a.point, a = a.parentNode;
                return b
            }, getChartCoordinatesFromPoint: function (a, c) {
                var b =
                    a.series, d = b.xAxis, b = b.yAxis;
                if (d && b)return c ? {
                    chartX: d.len + d.pos - a.clientX,
                    chartY: b.len + b.pos - a.plotY
                } : {chartX: a.clientX + d.pos, chartY: a.plotY + b.pos}
            }, getHoverData: function (b, c, d, e, l, h) {
                var r = b, g = c, r = l ? d : [g];
                e = !(!e || !b);
                c = g && !g.stickyTracking;
                var n = function (a, b) {
                    return 0 === b
                }, p;
                e ? n = function (a) {
                    return a === b
                } : c ? n = function (a) {
                    return a.series === g
                } : r = a.grep(d, function (a) {
                    return a.stickyTracking
                });
                p = e && !l ? [b] : this.getKDPoints(r, l, h);
                g = (r = a.find(p, n)) && r.series;
                e || c || !l || (p = this.getKDPoints(d, l, h));
                p.sort(function (a,
                                 b) {
                    return a.series.index - b.series.index
                });
                return {hoverPoint: r, hoverSeries: g, hoverPoints: p}
            }, runPointActions: function (b, c) {
                var d = this.chart, h = d.tooltip, l = h ? h.shared : !1, g = c || d.hoverPoint, r = g && g.series || d.hoverSeries;
                c = this.getHoverData(g, r, d.series, !!c || r && r.directTouch && this.isDirectTouch, l, b);
                var n, w, g = c.hoverPoint;
                n = (r = c.hoverSeries) && r.tooltipOptions.followPointer;
                w = (l = l && g && !g.series.noSharedTooltip) ? c.hoverPoints : g ? [g] : [];
                if (g && (g !== d.hoverPoint || h && h.isHidden)) {
                    q(d.hoverPoints || [], function (b) {
                        -1 ===
                        a.inArray(b, w) && b.setState()
                    });
                    q(w || [], function (a) {
                        a.setState("hover")
                    });
                    if (d.hoverSeries !== r)r.onMouseOver();
                    d.hoverPoint && d.hoverPoint.firePointEvent("mouseOut");
                    g.firePointEvent("mouseOver");
                    d.hoverPoints = w;
                    d.hoverPoint = g;
                    h && h.refresh(l ? w : g, b)
                } else n && h && !h.isHidden && (r = h.getAnchor([{}], b), h.updatePosition({
                    plotX: r[0],
                    plotY: r[1]
                }));
                this.unDocMouseMove || (this.unDocMouseMove = C(k, "mousemove", function (b) {
                    var c = G[a.hoverChartIndex];
                    if (c)c.pointer.onDocumentMouseMove(b)
                }));
                q(d.axes, function (c) {
                    e(c.crosshair.snap,
                        !0) ? a.find(w, function (a) {
                        return a.series[c.coll] === c
                    }) ? c.drawCrosshair(b, g) : c.hideCrosshair() : c.drawCrosshair(b)
                })
            }, reset: function (a, c) {
                var b = this.chart, e = b.hoverSeries, l = b.hoverPoint, h = b.hoverPoints, g = b.tooltip, n = g && g.shared ? h : l;
                a && n && q(d(n), function (b) {
                    b.series.isCartesian && void 0 === b.plotX && (a = !1)
                });
                if (a)g && n && (g.refresh(n), l && (l.setState(l.state, !0), q(b.axes, function (a) {
                    a.crosshair && a.drawCrosshair(null, l)
                }))); else {
                    if (l)l.onMouseOut();
                    h && q(h, function (a) {
                        a.setState()
                    });
                    if (e)e.onMouseOut();
                    g && g.hide(c);
                    this.unDocMouseMove && (this.unDocMouseMove = this.unDocMouseMove());
                    q(b.axes, function (a) {
                        a.hideCrosshair()
                    });
                    this.hoverX = b.hoverPoints = b.hoverPoint = null
                }
            }, scaleGroups: function (a, c) {
                var b = this.chart, d;
                q(b.series, function (e) {
                    d = a || e.getPlotBox();
                    e.xAxis && e.xAxis.zoomEnabled && e.group && (e.group.attr(d), e.markerGroup && (e.markerGroup.attr(d), e.markerGroup.clip(c ? b.clipRect : null)), e.dataLabelsGroup && e.dataLabelsGroup.attr(d))
                });
                b.clipRect.attr(c || b.clipBox)
            }, dragStart: function (a) {
                var b = this.chart;
                b.mouseIsDown =
                    a.type;
                b.cancelClick = !1;
                b.mouseDownX = this.mouseDownX = a.chartX;
                b.mouseDownY = this.mouseDownY = a.chartY
            }, drag: function (a) {
                var b = this.chart, c = b.options.chart, d = a.chartX, e = a.chartY, h = this.zoomHor, g = this.zoomVert, n = b.plotLeft, w = b.plotTop, p = b.plotWidth, k = b.plotHeight, m, q = this.selectionMarker, f = this.mouseDownX, t = this.mouseDownY, v = c.panKey && a[c.panKey + "Key"];
                q && q.touch || (d < n ? d = n : d > n + p && (d = n + p), e < w ? e = w : e > w + k && (e = w + k), this.hasDragged = Math.sqrt(Math.pow(f - d, 2) + Math.pow(t - e, 2)), 10 < this.hasDragged && (m = b.isInsidePlot(f -
                    n, t - w), b.hasCartesianSeries && (this.zoomX || this.zoomY) && m && !v && !q && (this.selectionMarker = q = b.renderer.rect(n, w, h ? 1 : p, g ? 1 : k, 0).attr({
                    fill: c.selectionMarkerFill || F("#335cad").setOpacity(.25).get(),
                    "class": "highcharts-selection-marker",
                    zIndex: 7
                }).add()), q && h && (d -= f, q.attr({
                    width: Math.abs(d),
                    x: (0 < d ? 0 : d) + f
                })), q && g && (d = e - t, q.attr({
                    height: Math.abs(d),
                    y: (0 < d ? 0 : d) + t
                })), m && !q && c.panning && b.pan(a, c.panning)))
            }, drop: function (a) {
                var b = this, c = this.chart, d = this.hasPinched;
                if (this.selectionMarker) {
                    var e = {
                        originalEvent: a,
                        xAxis: [], yAxis: []
                    }, h = this.selectionMarker, r = h.attr ? h.attr("x") : h.x, n = h.attr ? h.attr("y") : h.y, w = h.attr ? h.attr("width") : h.width, p = h.attr ? h.attr("height") : h.height, k;
                    if (this.hasDragged || d)q(c.axes, function (c) {
                        if (c.zoomEnabled && g(c.min) && (d || b[{xAxis: "zoomX", yAxis: "zoomY"}[c.coll]])) {
                            var l = c.horiz, f = "touchend" === a.type ? c.minPixelPadding : 0, h = c.toValue((l ? r : n) + f), l = c.toValue((l ? r + w : n + p) - f);
                            e[c.coll].push({axis: c, min: Math.min(h, l), max: Math.max(h, l)});
                            k = !0
                        }
                    }), k && u(c, "selection", e, function (a) {
                        c.zoom(v(a, d ?
                        {animation: !1} : null))
                    });
                    this.selectionMarker = this.selectionMarker.destroy();
                    d && this.scaleGroups()
                }
                c && (m(c.container, {cursor: c._cursor}), c.cancelClick = 10 < this.hasDragged, c.mouseIsDown = this.hasDragged = this.hasPinched = !1, this.pinchDown = [])
            }, onContainerMouseDown: function (a) {
                a = this.normalize(a);
                this.zoomOption(a);
                a.preventDefault && a.preventDefault();
                this.dragStart(a)
            }, onDocumentMouseUp: function (b) {
                G[a.hoverChartIndex] && G[a.hoverChartIndex].pointer.drop(b)
            }, onDocumentMouseMove: function (a) {
                var b = this.chart,
                    c = this.chartPosition;
                a = this.normalize(a, c);
                !c || this.inClass(a.target, "highcharts-tracker") || b.isInsidePlot(a.chartX - b.plotLeft, a.chartY - b.plotTop) || this.reset()
            }, onContainerMouseLeave: function (b) {
                var c = G[a.hoverChartIndex];
                c && (b.relatedTarget || b.toElement) && (c.pointer.reset(), c.pointer.chartPosition = null)
            }, onContainerMouseMove: function (b) {
                var c = this.chart;
                g(a.hoverChartIndex) && G[a.hoverChartIndex] && G[a.hoverChartIndex].mouseIsDown || (a.hoverChartIndex = c.index);
                b = this.normalize(b);
                b.returnValue = !1;
                "mousedown" === c.mouseIsDown && this.drag(b);
                !this.inClass(b.target, "highcharts-tracker") && !c.isInsidePlot(b.chartX - c.plotLeft, b.chartY - c.plotTop) || c.openMenu || this.runPointActions(b)
            }, inClass: function (a, c) {
                for (var b; a;) {
                    if (b = A(a, "class")) {
                        if (-1 !== b.indexOf(c))return !0;
                        if (-1 !== b.indexOf("highcharts-container"))return !1
                    }
                    a = a.parentNode
                }
            }, onTrackerMouseOut: function (a) {
                var b = this.chart.hoverSeries;
                a = a.relatedTarget || a.toElement;
                this.isDirectTouch = !1;
                if (!(!b || !a || b.stickyTracking || this.inClass(a, "highcharts-tooltip") ||
                    this.inClass(a, "highcharts-series-" + b.index) && this.inClass(a, "highcharts-tracker")))b.onMouseOut()
            }, onContainerClick: function (a) {
                var b = this.chart, c = b.hoverPoint, d = b.plotLeft, e = b.plotTop;
                a = this.normalize(a);
                b.cancelClick || (c && this.inClass(a.target, "highcharts-tracker") ? (u(c.series, "click", v(a, {point: c})), b.hoverPoint && c.firePointEvent("click", a)) : (v(a, this.getCoordinates(a)), b.isInsidePlot(a.chartX - d, a.chartY - e) && u(b, "click", a)))
            }, setDOMEvents: function () {
                var b = this, c = b.chart.container;
                c.onmousedown =
                    function (a) {
                        b.onContainerMouseDown(a)
                    };
                c.onmousemove = function (a) {
                    b.onContainerMouseMove(a)
                };
                c.onclick = function (a) {
                    b.onContainerClick(a)
                };
                C(c, "mouseleave", b.onContainerMouseLeave);
                1 === a.chartCount && C(k, "mouseup", b.onDocumentMouseUp);
                a.hasTouch && (c.ontouchstart = function (a) {
                    b.onContainerTouchStart(a)
                }, c.ontouchmove = function (a) {
                    b.onContainerTouchMove(a)
                }, 1 === a.chartCount && C(k, "touchend", b.onDocumentTouchEnd))
            }, destroy: function () {
                var b = this;
                b.unDocMouseMove && b.unDocMouseMove();
                n(b.chart.container, "mouseleave",
                    b.onContainerMouseLeave);
                a.chartCount || (n(k, "mouseup", b.onDocumentMouseUp), n(k, "touchend", b.onDocumentTouchEnd));
                clearInterval(b.tooltipTimeout);
                a.objectEach(b, function (a, c) {
                    b[c] = null
                })
            }
        }
    })(K);
    (function (a) {
        var C = a.charts, A = a.each, G = a.extend, F = a.map, m = a.noop, g = a.pick;
        G(a.Pointer.prototype, {
            pinchTranslate: function (a, g, m, u, h, e) {
                this.zoomHor && this.pinchTranslateDirection(!0, a, g, m, u, h, e);
                this.zoomVert && this.pinchTranslateDirection(!1, a, g, m, u, h, e)
            }, pinchTranslateDirection: function (a, g, m, u, h, e, n, d) {
                var c =
                    this.chart, w = a ? "x" : "y", b = a ? "X" : "Y", k = "chart" + b, q = a ? "width" : "height", v = c["plot" + (a ? "Left" : "Top")], l, B, r = d || 1, z = c.inverted, M = c.bounds[a ? "h" : "v"], p = 1 === g.length, E = g[0][k], I = m[0][k], L = !p && g[1][k], f = !p && m[1][k], t;
                m = function () {
                    !p && 20 < Math.abs(E - L) && (r = d || Math.abs(I - f) / Math.abs(E - L));
                    B = (v - I) / r + E;
                    l = c["plot" + (a ? "Width" : "Height")] / r
                };
                m();
                g = B;
                g < M.min ? (g = M.min, t = !0) : g + l > M.max && (g = M.max - l, t = !0);
                t ? (I -= .8 * (I - n[w][0]), p || (f -= .8 * (f - n[w][1])), m()) : n[w] = [I, f];
                z || (e[w] = B - v, e[q] = l);
                e = z ? 1 / r : r;
                h[q] = l;
                h[w] = g;
                u[z ? a ? "scaleY" :
                    "scaleX" : "scale" + b] = r;
                u["translate" + b] = e * v + (I - e * E)
            }, pinch: function (a) {
                var k = this, v = k.chart, u = k.pinchDown, h = a.touches, e = h.length, n = k.lastValidTouch, d = k.hasZoom, c = k.selectionMarker, w = {}, b = 1 === e && (k.inClass(a.target, "highcharts-tracker") && v.runTrackerClick || k.runChartClick), y = {};
                1 < e && (k.initiated = !0);
                d && k.initiated && !b && a.preventDefault();
                F(h, function (a) {
                    return k.normalize(a)
                });
                "touchstart" === a.type ? (A(h, function (a, b) {
                    u[b] = {chartX: a.chartX, chartY: a.chartY}
                }), n.x = [u[0].chartX, u[1] && u[1].chartX], n.y = [u[0].chartY,
                    u[1] && u[1].chartY], A(v.axes, function (a) {
                    if (a.zoomEnabled) {
                        var b = v.bounds[a.horiz ? "h" : "v"], c = a.minPixelPadding, d = a.toPixels(g(a.options.min, a.dataMin)), e = a.toPixels(g(a.options.max, a.dataMax)), h = Math.max(d, e);
                        b.min = Math.min(a.pos, Math.min(d, e) - c);
                        b.max = Math.max(a.pos + a.len, h + c)
                    }
                }), k.res = !0) : k.followTouchMove && 1 === e ? this.runPointActions(k.normalize(a)) : u.length && (c || (k.selectionMarker = c = G({
                    destroy: m,
                    touch: !0
                }, v.plotBox)), k.pinchTranslate(u, h, w, c, y, n), k.hasPinched = d, k.scaleGroups(w, y), k.res && (k.res = !1, this.reset(!1, 0)))
            }, touch: function (k, m) {
                var q = this.chart, u, h;
                if (q.index !== a.hoverChartIndex)this.onContainerMouseLeave({relatedTarget: !0});
                a.hoverChartIndex = q.index;
                1 === k.touches.length ? (k = this.normalize(k), (h = q.isInsidePlot(k.chartX - q.plotLeft, k.chartY - q.plotTop)) && !q.openMenu ? (m && this.runPointActions(k), "touchmove" === k.type && (m = this.pinchDown, u = m[0] ? 4 <= Math.sqrt(Math.pow(m[0].chartX - k.chartX, 2) + Math.pow(m[0].chartY - k.chartY, 2)) : !1), g(u, !0) && this.pinch(k)) : m && this.reset()) : 2 === k.touches.length &&
                this.pinch(k)
            }, onContainerTouchStart: function (a) {
                this.zoomOption(a);
                this.touch(a, !0)
            }, onContainerTouchMove: function (a) {
                this.touch(a)
            }, onDocumentTouchEnd: function (g) {
                C[a.hoverChartIndex] && C[a.hoverChartIndex].pointer.drop(g)
            }
        })
    })(K);
    (function (a) {
        var C = a.addEvent, A = a.charts, G = a.css, F = a.doc, m = a.extend, g = a.noop, k = a.Pointer, q = a.removeEvent, v = a.win, u = a.wrap;
        if (!a.hasTouch && (v.PointerEvent || v.MSPointerEvent)) {
            var h = {}, e = !!v.PointerEvent, n = function () {
                var c = [];
                c.item = function (a) {
                    return this[a]
                };
                a.objectEach(h,
                    function (a) {
                        c.push({pageX: a.pageX, pageY: a.pageY, target: a.target})
                    });
                return c
            }, d = function (c, d, b, e) {
                "touch" !== c.pointerType && c.pointerType !== c.MSPOINTER_TYPE_TOUCH || !A[a.hoverChartIndex] || (e(c), e = A[a.hoverChartIndex].pointer, e[d]({
                    type: b,
                    target: c.currentTarget,
                    preventDefault: g,
                    touches: n()
                }))
            };
            m(k.prototype, {
                onContainerPointerDown: function (a) {
                    d(a, "onContainerTouchStart", "touchstart", function (a) {
                        h[a.pointerId] = {pageX: a.pageX, pageY: a.pageY, target: a.currentTarget}
                    })
                }, onContainerPointerMove: function (a) {
                    d(a,
                        "onContainerTouchMove", "touchmove", function (a) {
                            h[a.pointerId] = {pageX: a.pageX, pageY: a.pageY};
                            h[a.pointerId].target || (h[a.pointerId].target = a.currentTarget)
                        })
                }, onDocumentPointerUp: function (a) {
                    d(a, "onDocumentTouchEnd", "touchend", function (a) {
                        delete h[a.pointerId]
                    })
                }, batchMSEvents: function (a) {
                    a(this.chart.container, e ? "pointerdown" : "MSPointerDown", this.onContainerPointerDown);
                    a(this.chart.container, e ? "pointermove" : "MSPointerMove", this.onContainerPointerMove);
                    a(F, e ? "pointerup" : "MSPointerUp", this.onDocumentPointerUp)
                }
            });
            u(k.prototype, "init", function (a, d, b) {
                a.call(this, d, b);
                this.hasZoom && G(d.container, {"-ms-touch-action": "none", "touch-action": "none"})
            });
            u(k.prototype, "setDOMEvents", function (a) {
                a.apply(this);
                (this.hasZoom || this.followTouchMove) && this.batchMSEvents(C)
            });
            u(k.prototype, "destroy", function (a) {
                this.batchMSEvents(q);
                a.call(this)
            })
        }
    })(K);
    (function (a) {
        var C = a.addEvent, A = a.css, G = a.discardElement, F = a.defined, m = a.each, g = a.isFirefox, k = a.marginNames, q = a.merge, v = a.pick, u = a.setAnimation, h = a.stableSort, e = a.win, n = a.wrap;
        a.Legend = function (a, c) {
            this.init(a, c)
        };
        a.Legend.prototype = {
            init: function (a, c) {
                this.chart = a;
                this.setOptions(c);
                c.enabled && (this.render(), C(this.chart, "endResize", function () {
                    this.legend.positionCheckboxes()
                }))
            }, setOptions: function (a) {
                var c = v(a.padding, 8);
                this.options = a;
                this.itemStyle = a.itemStyle;
                this.itemHiddenStyle = q(this.itemStyle, a.itemHiddenStyle);
                this.itemMarginTop = a.itemMarginTop || 0;
                this.padding = c;
                this.initialItemY = c - 5;
                this.itemHeight = this.maxItemWidth = 0;
                this.symbolWidth = v(a.symbolWidth, 16);
                this.pages =
                    []
            }, update: function (a, c) {
                var d = this.chart;
                this.setOptions(q(!0, this.options, a));
                this.destroy();
                d.isDirtyLegend = d.isDirtyBox = !0;
                v(c, !0) && d.redraw()
            }, colorizeItem: function (d, c) {
                d.legendGroup[c ? "removeClass" : "addClass"]("highcharts-legend-item-hidden");
                var e = this.options, b = d.legendItem, h = d.legendLine, g = d.legendSymbol, n = this.itemHiddenStyle.color, e = c ? e.itemStyle.color : n, l = c ? d.color || n : n, k = d.options && d.options.marker, r = {fill: l};
                b && b.css({fill: e, color: e});
                h && h.attr({stroke: l});
                g && (k && g.isMarker && (r = d.pointAttribs(),
                c || a.objectEach(r, function (a, b) {
                    r[b] = n
                })), g.attr(r))
            }, positionItem: function (a) {
                var c = this.options, d = c.symbolPadding, c = !c.rtl, b = a._legendItemPos, e = b[0], b = b[1], h = a.checkbox;
                (a = a.legendGroup) && a.element && a.translate(c ? e : this.legendWidth - e - 2 * d - 4, b);
                h && (h.x = e, h.y = b)
            }, destroyItem: function (a) {
                var c = a.checkbox;
                m(["legendItem", "legendLine", "legendSymbol", "legendGroup"], function (c) {
                    a[c] && (a[c] = a[c].destroy())
                });
                c && G(a.checkbox)
            }, destroy: function () {
                function a(a) {
                    this[a] && (this[a] = this[a].destroy())
                }

                m(this.getAllItems(),
                    function (c) {
                        m(["legendItem", "legendGroup"], a, c)
                    });
                m("clipRect up down pager nav box title group".split(" "), a, this);
                this.display = null
            }, positionCheckboxes: function (a) {
                var c = this.group && this.group.alignAttr, d, b = this.clipHeight || this.legendHeight, e = this.titleHeight;
                c && (d = c.translateY, m(this.allItems, function (h) {
                    var g = h.checkbox, l;
                    g && (l = d + e + g.y + (a || 0) + 3, A(g, {
                        left: c.translateX + h.checkboxOffset + g.x - 20 + "px",
                        top: l + "px",
                        display: l > d - 6 && l < d + b - 6 ? "" : "none"
                    }))
                }))
            }, renderTitle: function () {
                var a = this.options, c = this.padding,
                    e = a.title, b = 0;
                e.text && (this.title || (this.title = this.chart.renderer.label(e.text, c - 3, c - 4, null, null, null, a.useHTML, null, "legend-title").attr({zIndex: 1}).css(e.style).add(this.group)), a = this.title.getBBox(), b = a.height, this.offsetWidth = a.width, this.contentGroup.attr({translateY: b}));
                this.titleHeight = b
            }, setText: function (d) {
                var c = this.options;
                d.legendItem.attr({text: c.labelFormat ? a.format(c.labelFormat, d) : c.labelFormatter.call(d)})
            }, renderItem: function (a) {
                var c = this.chart, d = c.renderer, b = this.options, e =
                    "horizontal" === b.layout, h = this.symbolWidth, g = b.symbolPadding, l = this.itemStyle, n = this.itemHiddenStyle, r = this.padding, k = e ? v(b.itemDistance, 20) : 0, m = !b.rtl, p = b.width, E = b.itemMarginBottom || 0, I = this.itemMarginTop, u = a.legendItem, f = !a.series, t = !f && a.series.drawLegendSymbol ? a.series : a, A = t.options, J = this.createCheckboxForItem && A && A.showCheckbox, A = h + g + k + (J ? 20 : 0), N = b.useHTML, C = a.options.className;
                u || (a.legendGroup = d.g("legend-item").addClass("highcharts-" + t.type + "-series highcharts-color-" + a.colorIndex + (C ? " " +
                    C : "") + (f ? " highcharts-series-" + a.index : "")).attr({zIndex: 1}).add(this.scrollGroup), a.legendItem = u = d.text("", m ? h + g : -g, this.baseline || 0, N).css(q(a.visible ? l : n)).attr({
                    align: m ? "left" : "right",
                    zIndex: 2
                }).add(a.legendGroup), this.baseline || (h = l.fontSize, this.fontMetrics = d.fontMetrics(h, u), this.baseline = this.fontMetrics.f + 3 + I, u.attr("y", this.baseline)), this.symbolHeight = b.symbolHeight || this.fontMetrics.f, t.drawLegendSymbol(this, a), this.setItemEvents && this.setItemEvents(a, u, N), J && this.createCheckboxForItem(a));
                this.colorizeItem(a, a.visible);
                l.width || u.css({width: (b.itemWidth || c.spacingBox.width) - A});
                this.setText(a);
                d = u.getBBox();
                l = a.checkboxOffset = b.itemWidth || a.legendItemWidth || d.width + A;
                this.itemHeight = d = Math.round(a.legendItemHeight || d.height || this.symbolHeight);
                e && this.itemX - r + l > (p || c.spacingBox.width - 2 * r - b.x) && (this.itemX = r, this.itemY += I + this.lastLineHeight + E, this.lastLineHeight = 0);
                this.maxItemWidth = Math.max(this.maxItemWidth, l);
                this.lastItemY = I + this.itemY + E;
                this.lastLineHeight = Math.max(d, this.lastLineHeight);
                a._legendItemPos = [this.itemX, this.itemY];
                e ? this.itemX += l : (this.itemY += I + d + E, this.lastLineHeight = d);
                this.offsetWidth = p || Math.max((e ? this.itemX - r - k : l) + r, this.offsetWidth)
            }, getAllItems: function () {
                var a = [];
                m(this.chart.series, function (c) {
                    var d = c && c.options;
                    c && v(d.showInLegend, F(d.linkedTo) ? !1 : void 0, !0) && (a = a.concat(c.legendItems || ("point" === d.legendType ? c.data : c)))
                });
                return a
            }, adjustMargins: function (a, c) {
                var d = this.chart, b = this.options, e = b.align.charAt(0) + b.verticalAlign.charAt(0) + b.layout.charAt(0);
                b.floating || m([/(lth|ct|rth)/, /(rtv|rm|rbv)/, /(rbh|cb|lbh)/, /(lbv|lm|ltv)/], function (h, g) {
                    h.test(e) && !F(a[g]) && (d[k[g]] = Math.max(d[k[g]], d.legend[(g + 1) % 2 ? "legendHeight" : "legendWidth"] + [1, -1, -1, 1][g] * b[g % 2 ? "x" : "y"] + v(b.margin, 12) + c[g]))
                })
            }, render: function () {
                var a = this, c = a.chart, e = c.renderer, b = a.group, g, n, k, l, B = a.box, r = a.options, z = a.padding;
                a.itemX = z;
                a.itemY = a.initialItemY;
                a.offsetWidth = 0;
                a.lastItemY = 0;
                b || (a.group = b = e.g("legend").attr({zIndex: 7}).add(), a.contentGroup = e.g().attr({zIndex: 1}).add(b), a.scrollGroup =
                    e.g().add(a.contentGroup));
                a.renderTitle();
                g = a.getAllItems();
                h(g, function (a, b) {
                    return (a.options && a.options.legendIndex || 0) - (b.options && b.options.legendIndex || 0)
                });
                r.reversed && g.reverse();
                a.allItems = g;
                a.display = n = !!g.length;
                a.lastLineHeight = 0;
                m(g, function (b) {
                    a.renderItem(b)
                });
                k = (r.width || a.offsetWidth) + z;
                l = a.lastItemY + a.lastLineHeight + a.titleHeight;
                l = a.handleOverflow(l);
                l += z;
                B || (a.box = B = e.rect().addClass("highcharts-legend-box").attr({r: r.borderRadius}).add(b), B.isNew = !0);
                B.attr({
                    stroke: r.borderColor,
                    "stroke-width": r.borderWidth || 0, fill: r.backgroundColor || "none"
                }).shadow(r.shadow);
                0 < k && 0 < l && (B[B.isNew ? "attr" : "animate"](B.crisp({
                    x: 0,
                    y: 0,
                    width: k,
                    height: l
                }, B.strokeWidth())), B.isNew = !1);
                B[n ? "show" : "hide"]();
                a.legendWidth = k;
                a.legendHeight = l;
                m(g, function (b) {
                    a.positionItem(b)
                });
                n && b.align(q(r, {width: k, height: l}), !0, "spacingBox");
                c.isResizing || this.positionCheckboxes()
            }, handleOverflow: function (a) {
                var c = this, d = this.chart, b = d.renderer, e = this.options, h = e.y, g = this.padding, d = d.spacingBox.height + ("top" === e.verticalAlign ?
                        -h : h) - g, h = e.maxHeight, l, n = this.clipRect, r = e.navigation, k = v(r.animation, !0), q = r.arrowSize || 12, p = this.nav, E = this.pages, I, u = this.allItems, f = function (a) {
                    "number" === typeof a ? n.attr({height: a}) : n && (c.clipRect = n.destroy(), c.contentGroup.clip());
                    c.contentGroup.div && (c.contentGroup.div.style.clip = a ? "rect(" + g + "px,9999px," + (g + a) + "px,0)" : "auto")
                };
                "horizontal" !== e.layout || "middle" === e.verticalAlign || e.floating || (d /= 2);
                h && (d = Math.min(d, h));
                E.length = 0;
                a > d && !1 !== r.enabled ? (this.clipHeight = l = Math.max(d - 20 - this.titleHeight -
                    g, 0), this.currentPage = v(this.currentPage, 1), this.fullHeight = a, m(u, function (a, b) {
                    var c = a._legendItemPos[1];
                    a = Math.round(a.legendItem.getBBox().height);
                    var f = E.length;
                    if (!f || c - E[f - 1] > l && (I || c) !== E[f - 1])E.push(I || c), f++;
                    b === u.length - 1 && c + a - E[f - 1] > l && E.push(c);
                    c !== I && (I = c)
                }), n || (n = c.clipRect = b.clipRect(0, g, 9999, 0), c.contentGroup.clip(n)), f(l), p || (this.nav = p = b.g().attr({zIndex: 1}).add(this.group), this.up = b.symbol("triangle", 0, 0, q, q).on("click", function () {
                    c.scroll(-1, k)
                }).add(p), this.pager = b.text("", 15,
                    10).addClass("highcharts-legend-navigation").css(r.style).add(p), this.down = b.symbol("triangle-down", 0, 0, q, q).on("click", function () {
                    c.scroll(1, k)
                }).add(p)), c.scroll(0), a = d) : p && (f(), this.nav = p.destroy(), this.scrollGroup.attr({translateY: 1}), this.clipHeight = 0);
                return a
            }, scroll: function (a, c) {
                var d = this.pages, b = d.length;
                a = this.currentPage + a;
                var e = this.clipHeight, h = this.options.navigation, g = this.pager, l = this.padding;
                a > b && (a = b);
                0 < a && (void 0 !== c && u(c, this.chart), this.nav.attr({
                    translateX: l, translateY: e + this.padding +
                    7 + this.titleHeight, visibility: "visible"
                }), this.up.attr({"class": 1 === a ? "highcharts-legend-nav-inactive" : "highcharts-legend-nav-active"}), g.attr({text: a + "/" + b}), this.down.attr({
                    x: 18 + this.pager.getBBox().width,
                    "class": a === b ? "highcharts-legend-nav-inactive" : "highcharts-legend-nav-active"
                }), this.up.attr({fill: 1 === a ? h.inactiveColor : h.activeColor}).css({cursor: 1 === a ? "default" : "pointer"}), this.down.attr({fill: a === b ? h.inactiveColor : h.activeColor}).css({cursor: a === b ? "default" : "pointer"}), c = -d[a - 1] + this.initialItemY,
                    this.scrollGroup.animate({translateY: c}), this.currentPage = a, this.positionCheckboxes(c))
            }
        };
        a.LegendSymbolMixin = {
            drawRectangle: function (a, c) {
                var d = a.symbolHeight, b = a.options.squareSymbol;
                c.legendSymbol = this.chart.renderer.rect(b ? (a.symbolWidth - d) / 2 : 0, a.baseline - d + 1, b ? d : a.symbolWidth, d, v(a.options.symbolRadius, d / 2)).addClass("highcharts-point").attr({zIndex: 3}).add(c.legendGroup)
            }, drawLineMarker: function (a) {
                var c = this.options, d = c.marker, b = a.symbolWidth, e = a.symbolHeight, h = e / 2, g = this.chart.renderer, l =
                    this.legendGroup;
                a = a.baseline - Math.round(.3 * a.fontMetrics.b);
                var n;
                n = {"stroke-width": c.lineWidth || 0};
                c.dashStyle && (n.dashstyle = c.dashStyle);
                this.legendLine = g.path(["M", 0, a, "L", b, a]).addClass("highcharts-graph").attr(n).add(l);
                d && !1 !== d.enabled && (c = Math.min(v(d.radius, h), h), 0 === this.symbol.indexOf("url") && (d = q(d, {
                    width: e,
                    height: e
                }), c = 0), this.legendSymbol = d = g.symbol(this.symbol, b / 2 - c, a - c, 2 * c, 2 * c, d).addClass("highcharts-point").add(l), d.isMarker = !0)
            }
        };
        (/Trident\/7\.0/.test(e.navigator.userAgent) || g) &&
        n(a.Legend.prototype, "positionItem", function (a, c) {
            var d = this, b = function () {
                c._legendItemPos && a.call(d, c)
            };
            b();
            setTimeout(b)
        })
    })(K);
    (function (a) {
        var C = a.addEvent, A = a.animate, G = a.animObject, F = a.attr, m = a.doc, g = a.Axis, k = a.createElement, q = a.defaultOptions, v = a.discardElement, u = a.charts, h = a.css, e = a.defined, n = a.each, d = a.extend, c = a.find, w = a.fireEvent, b = a.getStyle, y = a.grep, D = a.isNumber, H = a.isObject, l = a.isString, B = a.Legend, r = a.marginNames, z = a.merge, M = a.objectEach, p = a.Pointer, E = a.pick, I = a.pInt, L = a.removeEvent,
            f = a.seriesTypes, t = a.splat, R = a.svg, J = a.syncTimeout, N = a.win, O = a.Renderer, P = a.Chart = function () {
                this.getArgs.apply(this, arguments)
            };
        a.chart = function (a, b, c) {
            return new P(a, b, c)
        };
        d(P.prototype, {
            callbacks: [], getArgs: function () {
                var a = [].slice.call(arguments);
                if (l(a[0]) || a[0].nodeName)this.renderTo = a.shift();
                this.init(a[0], a[1])
            }, init: function (b, c) {
                var f, d, e = b.series, p = b.plotOptions || {};
                b.series = null;
                f = z(q, b);
                for (d in f.plotOptions)f.plotOptions[d].tooltip = p[d] && z(p[d].tooltip) || void 0;
                f.tooltip.userOptions =
                    b.chart && b.chart.forExport && b.tooltip.userOptions || b.tooltip;
                f.series = b.series = e;
                this.userOptions = b;
                b = f.chart;
                d = b.events;
                this.margin = [];
                this.spacing = [];
                this.bounds = {h: {}, v: {}};
                this.callback = c;
                this.isResizing = 0;
                this.options = f;
                this.axes = [];
                this.series = [];
                this.hasCartesianSeries = b.showAxes;
                var h = this;
                h.index = u.length;
                u.push(h);
                a.chartCount++;
                d && M(d, function (a, b) {
                    C(h, b, a)
                });
                h.xAxis = [];
                h.yAxis = [];
                h.pointCount = h.colorCounter = h.symbolCounter = 0;
                h.firstRender()
            }, initSeries: function (b) {
                var c = this.options.chart;
                (c = f[b.type || c.type || c.defaultSeriesType]) || a.error(17, !0);
                c = new c;
                c.init(this, b);
                return c
            }, orderSeries: function (a) {
                var b = this.series;
                for (a = a || 0; a < b.length; a++)b[a] && (b[a].index = a, b[a].name = b[a].name || "Series " + (b[a].index + 1))
            }, isInsidePlot: function (a, b, c) {
                var f = c ? b : a;
                a = c ? a : b;
                return 0 <= f && f <= this.plotWidth && 0 <= a && a <= this.plotHeight
            }, redraw: function (b) {
                var c = this.axes, f = this.series, e = this.pointer, p = this.legend, h = this.isDirtyLegend, l, g, r = this.hasCartesianSeries, t = this.isDirtyBox, x, k = this.renderer, m =
                    k.isHidden(), E = [];
                this.setResponsive && this.setResponsive(!1);
                a.setAnimation(b, this);
                m && this.temporaryDisplay();
                this.layOutTitles();
                for (b = f.length; b--;)if (x = f[b], x.options.stacking && (l = !0, x.isDirty)) {
                    g = !0;
                    break
                }
                if (g)for (b = f.length; b--;)x = f[b], x.options.stacking && (x.isDirty = !0);
                n(f, function (a) {
                    a.isDirty && "point" === a.options.legendType && (a.updateTotals && a.updateTotals(), h = !0);
                    a.isDirtyData && w(a, "updatedData")
                });
                h && p.options.enabled && (p.render(), this.isDirtyLegend = !1);
                l && this.getStacks();
                r && n(c, function (a) {
                    a.updateNames();
                    a.setScale()
                });
                this.getMargins();
                r && (n(c, function (a) {
                    a.isDirty && (t = !0)
                }), n(c, function (a) {
                    var b = a.min + "," + a.max;
                    a.extKey !== b && (a.extKey = b, E.push(function () {
                        w(a, "afterSetExtremes", d(a.eventArgs, a.getExtremes()));
                        delete a.eventArgs
                    }));
                    (t || l) && a.redraw()
                }));
                t && this.drawChartBox();
                w(this, "predraw");
                n(f, function (a) {
                    (t || a.isDirty) && a.visible && a.redraw();
                    a.isDirtyData = !1
                });
                e && e.reset(!0);
                k.draw();
                w(this, "redraw");
                w(this, "render");
                m && this.temporaryDisplay(!0);
                n(E, function (a) {
                    a.call()
                })
            }, get: function (a) {
                function b(b) {
                    return b.id ===
                        a || b.options && b.options.id === a
                }

                var f, d = this.series, e;
                f = c(this.axes, b) || c(this.series, b);
                for (e = 0; !f && e < d.length; e++)f = c(d[e].points || [], b);
                return f
            }, getAxes: function () {
                var a = this, b = this.options, c = b.xAxis = t(b.xAxis || {}), b = b.yAxis = t(b.yAxis || {});
                n(c, function (a, b) {
                    a.index = b;
                    a.isX = !0
                });
                n(b, function (a, b) {
                    a.index = b
                });
                c = c.concat(b);
                n(c, function (b) {
                    new g(a, b)
                })
            }, getSelectedPoints: function () {
                var a = [];
                n(this.series, function (b) {
                    a = a.concat(y(b.data || [], function (a) {
                        return a.selected
                    }))
                });
                return a
            }, getSelectedSeries: function () {
                return y(this.series,
                    function (a) {
                        return a.selected
                    })
            }, setTitle: function (a, b, c) {
                var f = this, d = f.options, e;
                e = d.title = z({style: {color: "#e0faff", fontSize: d.isStock ? "16px" : "18px"}}, d.title, a);
                d = d.subtitle = z({style: {color: "#e0faff"}}, d.subtitle, b);
                n([["title", a, e], ["subtitle", b, d]], function (a, b) {
                    var c = a[0], d = f[c], e = a[1];
                    a = a[2];
                    d && e && (f[c] = d = d.destroy());
                    a && a.text && !d && (f[c] = f.renderer.text(a.text, 0, 0, a.useHTML).attr({
                        align: a.align,
                        "class": "highcharts-" + c,
                        zIndex: a.zIndex || 4
                    }).add(), f[c].update = function (a) {
                        f.setTitle(!b && a, b &&
                            a)
                    }, f[c].css(a.style))
                });
                f.layOutTitles(c)
            }, layOutTitles: function (a) {
                var b = 0, c, f = this.renderer, e = this.spacingBox;
                n(["title", "subtitle"], function (a) {
                    var c = this[a], p = this.options[a];
                    a = "title" === a ? -3 : p.verticalAlign ? 0 : b + 2;
                    var h;
                    c && (h = p.style.fontSize, h = f.fontMetrics(h, c).b, c.css({width: (p.width || e.width + p.widthAdjust) + "px"}).align(d({y: a + h}, p), !1, "spacingBox"), p.floating || p.verticalAlign || (b = Math.ceil(b + c.getBBox(p.useHTML).height)))
                }, this);
                c = this.titleOffset !== b;
                this.titleOffset = b;
                !this.isDirtyBox &&
                c && (this.isDirtyBox = c, this.hasRendered && E(a, !0) && this.isDirtyBox && this.redraw())
            }, getChartSize: function () {
                var c = this.options.chart, f = c.width, c = c.height, d = this.renderTo;
                e(f) || (this.containerWidth = b(d, "width"));
                e(c) || (this.containerHeight = b(d, "height"));
                this.chartWidth = Math.max(0, f || this.containerWidth || 600);
                this.chartHeight = Math.max(0, a.relativeLength(c, this.chartWidth) || this.containerHeight || 400)
            }, temporaryDisplay: function (c) {
                var f = this.renderTo;
                if (c)for (; f && f.style;)f.hcOrigStyle && (a.css(f, f.hcOrigStyle),
                    delete f.hcOrigStyle), f = f.parentNode; else for (; f && f.style;)"none" === b(f, "display", !1) && (f.hcOrigStyle = {
                    display: f.style.display,
                    height: f.style.height,
                    overflow: f.style.overflow
                }, c = {
                    display: "block",
                    overflow: "hidden"
                }, f !== this.renderTo && (c.height = 0), a.css(f, c), f.style.setProperty && f.style.setProperty("display", "block", "important")), f = f.parentNode
            }, setClassName: function (a) {
                this.container.className = "highcharts-container " + (a || "")
            }, getContainer: function () {
                var b, c = this.options, f = c.chart, e, p;
                b = this.renderTo;
                var h = a.uniqueKey(), g;
                b || (this.renderTo = b = f.renderTo);
                l(b) && (this.renderTo = b = m.getElementById(b));
                b || a.error(13, !0);
                e = I(F(b, "data-highcharts-chart"));
                D(e) && u[e] && u[e].hasRendered && u[e].destroy();
                F(b, "data-highcharts-chart", this.index);
                b.innerHTML = "";
                f.skipClone || b.offsetWidth || this.temporaryDisplay();
                this.getChartSize();
                e = this.chartWidth;
                p = this.chartHeight;
                g = d({
                        position: "relative",
                        overflow: "hidden",
                        width: e + "px",
                        height: p + "px",
                        textAlign: "left",
                        lineHeight: "normal",
                        zIndex: 0,
                        "-webkit-tap-highlight-color": "rgba(0,0,0,0)"
                    },
                    f.style);
                this.container = b = k("div", {id: h}, g, b);
                this._cursor = b.style.cursor;
                this.renderer = new (a[f.renderer] || O)(b, e, p, null, f.forExport, c.exporting && c.exporting.allowHTML);
                this.setClassName(f.className);
                this.renderer.setStyle(f.style);
                this.renderer.chartIndex = this.index
            }, getMargins: function (a) {
                var b = this.spacing, c = this.margin, f = this.titleOffset;
                this.resetMargins();
                f && !e(c[0]) && (this.plotTop = Math.max(this.plotTop, f + this.options.title.margin + b[0]));
                this.legend.display && this.legend.adjustMargins(c, b);
                this.extraMargin && (this[this.extraMargin.type] = (this[this.extraMargin.type] || 0) + this.extraMargin.value);
                this.extraTopMargin && (this.plotTop += this.extraTopMargin);
                a || this.getAxisMargins()
            }, getAxisMargins: function () {
                var a = this, b = a.axisOffset = [0, 0, 0, 0], c = a.margin;
                a.hasCartesianSeries && n(a.axes, function (a) {
                    a.visible && a.getOffset()
                });
                n(r, function (f, d) {
                    e(c[d]) || (a[f] += b[d])
                });
                a.setChartSize()
            }, reflow: function (a) {
                var c = this, f = c.options.chart, d = c.renderTo, p = e(f.width), h = f.width || b(d, "width"), f = f.height || b(d,
                        "height"), d = a ? a.target : N;
                if (!p && !c.isPrinting && h && f && (d === N || d === m)) {
                    if (h !== c.containerWidth || f !== c.containerHeight)clearTimeout(c.reflowTimeout), c.reflowTimeout = J(function () {
                        c.container && c.setSize(void 0, void 0, !1)
                    }, a ? 100 : 0);
                    c.containerWidth = h;
                    c.containerHeight = f
                }
            }, initReflow: function () {
                var a = this, b;
                b = C(N, "resize", function (b) {
                    a.reflow(b)
                });
                C(a, "destroy", b)
            }, setSize: function (b, c, f) {
                var d = this, e = d.renderer;
                d.isResizing += 1;
                a.setAnimation(f, d);
                d.oldChartHeight = d.chartHeight;
                d.oldChartWidth = d.chartWidth;
                void 0 !== b && (d.options.chart.width = b);
                void 0 !== c && (d.options.chart.height = c);
                d.getChartSize();
                b = e.globalAnimation;
                (b ? A : h)(d.container, {width: d.chartWidth + "px", height: d.chartHeight + "px"}, b);
                d.setChartSize(!0);
                e.setSize(d.chartWidth, d.chartHeight, f);
                n(d.axes, function (a) {
                    a.isDirty = !0;
                    a.setScale()
                });
                d.isDirtyLegend = !0;
                d.isDirtyBox = !0;
                d.layOutTitles();
                d.getMargins();
                d.redraw(f);
                d.oldChartHeight = null;
                w(d, "resize");
                J(function () {
                    d && w(d, "endResize", null, function () {
                        --d.isResizing
                    })
                }, G(b).duration)
            }, setChartSize: function (a) {
                function b(a) {
                    a =
                        l[a] || 0;
                    return Math.max(m || a, a) / 2
                }

                var c = this.inverted, f = this.renderer, d = this.chartWidth, e = this.chartHeight, p = this.options.chart, h = this.spacing, l = this.clipOffset, g, r, t, k, m;
                this.plotLeft = g = Math.round(this.plotLeft);
                this.plotTop = r = Math.round(this.plotTop);
                this.plotWidth = t = Math.max(0, Math.round(d - g - this.marginRight));
                this.plotHeight = k = Math.max(0, Math.round(e - r - this.marginBottom));
                this.plotSizeX = c ? k : t;
                this.plotSizeY = c ? t : k;
                this.plotBorderWidth = p.plotBorderWidth || 0;
                this.spacingBox = f.spacingBox = {
                    x: h[3], y: h[0],
                    width: d - h[3] - h[1], height: e - h[0] - h[2]
                };
                this.plotBox = f.plotBox = {x: g, y: r, width: t, height: k};
                m = 2 * Math.floor(this.plotBorderWidth / 2);
                c = Math.ceil(b(3));
                f = Math.ceil(b(0));
                this.clipBox = {
                    x: c,
                    y: f,
                    width: Math.floor(this.plotSizeX - b(1) - c),
                    height: Math.max(0, Math.floor(this.plotSizeY - b(2) - f))
                };
                a || n(this.axes, function (a) {
                    a.setAxisSize();
                    a.setAxisTranslation()
                })
            }, resetMargins: function () {
                var a = this, b = a.options.chart;
                n(["margin", "spacing"], function (c) {
                    var f = b[c], d = H(f) ? f : [f, f, f, f];
                    n(["Top", "Right", "Bottom", "Left"], function (f,
                                                                    e) {
                        a[c][e] = E(b[c + f], d[e])
                    })
                });
                n(r, function (b, c) {
                    a[b] = E(a.margin[c], a.spacing[c])
                });
                a.axisOffset = [0, 0, 0, 0];
                a.clipOffset = []
            }, drawChartBox: function () {
                var a = this.options.chart, b = this.renderer, c = this.chartWidth, f = this.chartHeight, d = this.chartBackground, e = this.plotBackground, p = this.plotBorder, h, l = this.plotBGImage, g = a.backgroundColor, n = a.plotBackgroundColor, r = a.plotBackgroundImage, t, k = this.plotLeft, m = this.plotTop, E = this.plotWidth, w = this.plotHeight, q = this.plotBox, I = this.clipRect, z = this.clipBox, y = "animate";
                d || (this.chartBackground = d = b.rect().addClass("highcharts-background").add(), y = "attr");
                h = a.borderWidth || 0;
                t = h + (a.shadow ? 8 : 0);
                g = {fill: g || "none"};
                if (h || d["stroke-width"])g.stroke = a.borderColor, g["stroke-width"] = h;
                d.attr(g).shadow(a.shadow);
                d[y]({x: t / 2, y: t / 2, width: c - t - h % 2, height: f - t - h % 2, r: a.borderRadius});
                y = "animate";
                e || (y = "attr", this.plotBackground = e = b.rect().addClass("highcharts-plot-background").add());
                e[y](q);
                e.attr({fill: n || "none"}).shadow(a.plotShadow);
                r && (l ? l.animate(q) : this.plotBGImage = b.image(r,
                    k, m, E, w).add());
                I ? I.animate({width: z.width, height: z.height}) : this.clipRect = b.clipRect(z);
                y = "animate";
                p || (y = "attr", this.plotBorder = p = b.rect().addClass("highcharts-plot-border").attr({zIndex: 1}).add());
                p.attr({stroke: a.plotBorderColor, "stroke-width": a.plotBorderWidth || 0, fill: "none"});
                p[y](p.crisp({x: k, y: m, width: E, height: w}, -p.strokeWidth()));
                this.isDirtyBox = !1
            }, propFromSeries: function () {
                var a = this, b = a.options.chart, c, d = a.options.series, e, p;
                n(["inverted", "angular", "polar"], function (h) {
                    c = f[b.type || b.defaultSeriesType];
                    p = b[h] || c && c.prototype[h];
                    for (e = d && d.length; !p && e--;)(c = f[d[e].type]) && c.prototype[h] && (p = !0);
                    a[h] = p
                })
            }, linkSeries: function () {
                var a = this, b = a.series;
                n(b, function (a) {
                    a.linkedSeries.length = 0
                });
                n(b, function (b) {
                    var c = b.options.linkedTo;
                    l(c) && (c = ":previous" === c ? a.series[b.index - 1] : a.get(c)) && c.linkedParent !== b && (c.linkedSeries.push(b), b.linkedParent = c, b.visible = E(b.options.visible, c.options.visible, b.visible))
                })
            }, renderSeries: function () {
                n(this.series, function (a) {
                    a.translate();
                    a.render()
                })
            }, renderLabels: function () {
                var a =
                    this, b = a.options.labels;
                b.items && n(b.items, function (c) {
                    var f = d(b.style, c.style), e = I(f.left) + a.plotLeft, p = I(f.top) + a.plotTop + 12;
                    delete f.left;
                    delete f.top;
                    a.renderer.text(c.html, e, p).attr({zIndex: 2}).css(f).add()
                })
            }, render: function () {
                var a = this.axes, b = this.renderer, c = this.options, f, d, e;
                this.setTitle();
                this.legend = new B(this, c.legend);
                this.getStacks && this.getStacks();
                this.getMargins(!0);
                this.setChartSize();
                c = this.plotWidth;
                f = this.plotHeight -= 21;
                n(a, function (a) {
                    a.setScale()
                });
                this.getAxisMargins();
                d =
                    1.1 < c / this.plotWidth;
                e = 1.05 < f / this.plotHeight;
                if (d || e)n(a, function (a) {
                    (a.horiz && d || !a.horiz && e) && a.setTickInterval(!0)
                }), this.getMargins();
                this.drawChartBox();
                this.hasCartesianSeries && n(a, function (a) {
                    a.visible && a.render()
                });
                this.seriesGroup || (this.seriesGroup = b.g("series-group").attr({zIndex: 3}).add());
                this.renderSeries();
                this.renderLabels();
                this.addCredits();
                this.setResponsive && this.setResponsive();
                this.hasRendered = !0
            }, addCredits: function (a) {
                var b = this;
                a = z(!0, this.options.credits, a);
                a.enabled && !this.credits &&
                (this.credits = this.renderer.text(a.text + (this.mapCredits || ""), 0, 0).addClass("highcharts-credits").on("click", function () {
                    a.href && (N.location.href = a.href)
                }).attr({
                    align: a.position.align,
                    zIndex: 8
                }).css(a.style).add().align(a.position), this.credits.update = function (a) {
                    b.credits = b.credits.destroy();
                    b.addCredits(a)
                })
            }, destroy: function () {
                var b = this, c = b.axes, f = b.series, d = b.container, e, p = d && d.parentNode;
                w(b, "destroy");
                b.renderer.forExport ? a.erase(u, b) : u[b.index] = void 0;
                a.chartCount--;
                b.renderTo.removeAttribute("data-highcharts-chart");
                L(b);
                for (e = c.length; e--;)c[e] = c[e].destroy();
                this.scroller && this.scroller.destroy && this.scroller.destroy();
                for (e = f.length; e--;)f[e] = f[e].destroy();
                n("title subtitle chartBackground plotBackground plotBGImage plotBorder seriesGroup clipRect credits pointer rangeSelector legend resetZoomButton tooltip renderer".split(" "), function (a) {
                    var c = b[a];
                    c && c.destroy && (b[a] = c.destroy())
                });
                d && (d.innerHTML = "", L(d), p && v(d));
                M(b, function (a, c) {
                    delete b[c]
                })
            }, isReadyToRender: function () {
                var a = this;
                return R || N != N.top ||
                "complete" === m.readyState ? !0 : (m.attachEvent("onreadystatechange", function () {
                    m.detachEvent("onreadystatechange", a.firstRender);
                    "complete" === m.readyState && a.firstRender()
                }), !1)
            }, firstRender: function () {
                var a = this, b = a.options;
                if (a.isReadyToRender()) {
                    a.getContainer();
                    w(a, "init");
                    a.resetMargins();
                    a.setChartSize();
                    a.propFromSeries();
                    a.getAxes();
                    n(b.series || [], function (b) {
                        a.initSeries(b)
                    });
                    a.linkSeries();
                    w(a, "beforeRender");
                    p && (a.pointer = new p(a, b));
                    a.render();
                    if (!a.renderer.imgCount && a.onload)a.onload();
                    a.temporaryDisplay(!0)
                }
            }, onload: function () {
                n([this.callback].concat(this.callbacks), function (a) {
                    a && void 0 !== this.index && a.apply(this, [this])
                }, this);
                w(this, "load");
                w(this, "render");
                e(this.index) && !1 !== this.options.chart.reflow && this.initReflow();
                this.onload = null
            }
        })
    })(K);
    (function (a) {
        var C, A = a.each, G = a.extend, F = a.erase, m = a.fireEvent, g = a.format, k = a.isArray, q = a.isNumber, v = a.pick, u = a.removeEvent;
        a.Point = C = function () {
        };
        a.Point.prototype = {
            init: function (a, e, g) {
                this.series = a;
                this.color = a.color;
                this.applyOptions(e,
                    g);
                a.options.colorByPoint ? (e = a.options.colors || a.chart.options.colors, this.color = this.color || e[a.colorCounter], e = e.length, g = a.colorCounter, a.colorCounter++, a.colorCounter === e && (a.colorCounter = 0)) : g = a.colorIndex;
                this.colorIndex = v(this.colorIndex, g);
                a.chart.pointCount++;
                return this
            }, applyOptions: function (a, e) {
                var h = this.series, d = h.options.pointValKey || h.pointValKey;
                a = C.prototype.optionsToObject.call(this, a);
                G(this, a);
                this.options = this.options ? G(this.options, a) : a;
                a.group && delete this.group;
                d && (this.y =
                    this[d]);
                this.isNull = v(this.isValid && !this.isValid(), null === this.x || !q(this.y, !0));
                this.selected && (this.state = "select");
                "name" in this && void 0 === e && h.xAxis && h.xAxis.hasNames && (this.x = h.xAxis.nameToX(this));
                void 0 === this.x && h && (this.x = void 0 === e ? h.autoIncrement(this) : e);
                return this
            }, optionsToObject: function (a) {
                var e = {}, h = this.series, d = h.options.keys, c = d || h.pointArrayMap || ["y"], g = c.length, b = 0, m = 0;
                if (q(a) || null === a)e[c[0]] = a; else if (k(a))for (!d && a.length > g && (h = typeof a[0], "string" === h ? e.name = a[0] : "number" ===
                h && (e.x = a[0]), b++); m < g;)d && void 0 === a[b] || (e[c[m]] = a[b]), b++, m++; else"object" === typeof a && (e = a, a.dataLabels && (h._hasPointLabels = !0), a.marker && (h._hasPointMarkers = !0));
                return e
            }, getClassName: function () {
                return "highcharts-point" + (this.selected ? " highcharts-point-select" : "") + (this.negative ? " highcharts-negative" : "") + (this.isNull ? " highcharts-null-point" : "") + (void 0 !== this.colorIndex ? " highcharts-color-" + this.colorIndex : "") + (this.options.className ? " " + this.options.className : "") + (this.zone && this.zone.className ?
                    " " + this.zone.className.replace("highcharts-negative", "") : "")
            }, getZone: function () {
                var a = this.series, e = a.zones, a = a.zoneAxis || "y", g = 0, d;
                for (d = e[g]; this[a] >= d.value;)d = e[++g];
                d && d.color && !this.options.color && (this.color = d.color);
                return d
            }, destroy: function () {
                var a = this.series.chart, e = a.hoverPoints, g;
                a.pointCount--;
                e && (this.setState(), F(e, this), e.length || (a.hoverPoints = null));
                if (this === a.hoverPoint)this.onMouseOut();
                if (this.graphic || this.dataLabel)u(this), this.destroyElements();
                this.legendItem && a.legend.destroyItem(this);
                for (g in this)this[g] = null
            }, destroyElements: function () {
                for (var a = ["graphic", "dataLabel", "dataLabelUpper", "connector", "shadowGroup"], e, g = 6; g--;)e = a[g], this[e] && (this[e] = this[e].destroy())
            }, getLabelConfig: function () {
                return {
                    x: this.category,
                    y: this.y,
                    color: this.color,
                    colorIndex: this.colorIndex,
                    key: this.name || this.category,
                    series: this.series,
                    point: this,
                    percentage: this.percentage,
                    total: this.total || this.stackTotal
                }
            }, tooltipFormatter: function (a) {
                var e = this.series, h = e.tooltipOptions, d = v(h.valueDecimals, ""),
                    c = h.valuePrefix || "", k = h.valueSuffix || "";
                A(e.pointArrayMap || ["y"], function (b) {
                    b = "{point." + b;
                    if (c || k)a = a.replace(b + "}", c + b + "}" + k);
                    a = a.replace(b + "}", b + ":,." + d + "f}")
                });
                return g(a, {point: this, series: this.series})
            }, firePointEvent: function (a, e, g) {
                var d = this, c = this.series.options;
                (c.point.events[a] || d.options && d.options.events && d.options.events[a]) && this.importEvents();
                "click" === a && c.allowPointSelect && (g = function (a) {
                    d.select && d.select(null, a.ctrlKey || a.metaKey || a.shiftKey)
                });
                m(this, a, e, g)
            }, visible: !0
        }
    })(K);
    (function (a) {
        var C = a.addEvent, A = a.animObject, G = a.arrayMax, F = a.arrayMin, m = a.correctFloat, g = a.Date, k = a.defaultOptions, q = a.defaultPlotOptions, v = a.defined, u = a.each, h = a.erase, e = a.extend, n = a.fireEvent, d = a.grep, c = a.isArray, w = a.isNumber, b = a.isString, y = a.merge, D = a.objectEach, H = a.pick, l = a.removeEvent, B = a.splat, r = a.SVGElement, z = a.syncTimeout, M = a.win;
        a.Series = a.seriesType("line", null, {
            lineWidth: 2, allowPointSelect: !1, showCheckbox: !1, animation: {duration: 1E3}, events: {}, marker: {
                lineWidth: 0, lineColor: "#ffffff", radius: 4,
                states: {
                    hover: {animation: {duration: 50}, enabled: !0, radiusPlus: 2, lineWidthPlus: 1},
                    select: {fillColor: "#cccccc", lineColor: "#000000", lineWidth: 2}
                }
            }, point: {events: {}}, dataLabels: {
                align: "center",
                formatter: function () {
                    return null === this.y ? "" : a.numberFormat(this.y, -1)
                },
                style: {fontSize: "11px", fontWeight: "bold", color: "contrast", textOutline: "1px contrast"},
                verticalAlign: "bottom",
                x: 0,
                y: 0,
                padding: 5
            }, cropThreshold: 300, pointRange: 0, softThreshold: !0, states: {
                hover: {
                    animation: {duration: 50}, lineWidthPlus: 1, marker: {},
                    halo: {size: 10, opacity: .25}
                }, select: {marker: {}}
            }, stickyTracking: !0, turboThreshold: 1E3, findNearestPointBy: "x"
        }, {
            isCartesian: !0,
            pointClass: a.Point,
            sorted: !0,
            requireSorting: !0,
            directTouch: !1,
            axisTypes: ["xAxis", "yAxis"],
            colorCounter: 0,
            parallelArrays: ["x", "y"],
            coll: "series",
            init: function (a, b) {
                var c = this, d, f = a.series, p;
                c.chart = a;
                c.options = b = c.setOptions(b);
                c.linkedSeries = [];
                c.bindAxes();
                e(c, {name: b.name, state: "", visible: !1 !== b.visible, selected: !0 === b.selected});
                d = b.events;
                D(d, function (a, b) {
                    C(c, b, a)
                });
                if (d &&
                    d.click || b.point && b.point.events && b.point.events.click || b.allowPointSelect)a.runTrackerClick = !0;
                c.getColor();
                c.getSymbol();
                u(c.parallelArrays, function (a) {
                    c[a + "Data"] = []
                });
                c.setData(b.data, !1);
                c.isCartesian && (a.hasCartesianSeries = !0);
                f.length && (p = f[f.length - 1]);
                c._i = H(p && p._i, -1) + 1;
                a.orderSeries(this.insert(f))
            },
            insert: function (a) {
                var b = this.options.index, c;
                if (w(b)) {
                    for (c = a.length; c--;)if (b >= H(a[c].options.index, a[c]._i)) {
                        a.splice(c + 1, 0, this);
                        break
                    }
                    -1 === c && a.unshift(this);
                    c += 1
                } else a.push(this);
                return H(c,
                    a.length - 1)
            },
            bindAxes: function () {
                var b = this, c = b.options, d = b.chart, e;
                u(b.axisTypes || [], function (f) {
                    u(d[f], function (a) {
                        e = a.options;
                        if (c[f] === e.index || void 0 !== c[f] && c[f] === e.id || void 0 === c[f] && 0 === e.index)b.insert(a.series), b[f] = a, a.isDirty = !0
                    });
                    b[f] || b.optionalAxis === f || a.error(18, !0)
                })
            },
            updateParallelArrays: function (a, b) {
                var c = a.series, d = arguments, f = w(b) ? function (f) {
                    var d = "y" === f && c.toYData ? c.toYData(a) : a[f];
                    c[f + "Data"][b] = d
                } : function (a) {
                    Array.prototype[b].apply(c[a + "Data"], Array.prototype.slice.call(d,
                        2))
                };
                u(c.parallelArrays, f)
            },
            autoIncrement: function () {
                var a = this.options, b = this.xIncrement, c, d = a.pointIntervalUnit, b = H(b, a.pointStart, 0);
                this.pointInterval = c = H(this.pointInterval, a.pointInterval, 1);
                d && (a = new g(b), "day" === d ? a = +a[g.hcSetDate](a[g.hcGetDate]() + c) : "month" === d ? a = +a[g.hcSetMonth](a[g.hcGetMonth]() + c) : "year" === d && (a = +a[g.hcSetFullYear](a[g.hcGetFullYear]() + c)), c = a - b);
                this.xIncrement = b + c;
                return b
            },
            setOptions: function (a) {
                var b = this.chart, c = b.options, d = c.plotOptions, f = (b.userOptions || {}).plotOptions ||
                    {}, e = d[this.type];
                this.userOptions = a;
                b = y(e, d.series, a);
                this.tooltipOptions = y(k.tooltip, k.plotOptions.series && k.plotOptions.series.tooltip, k.plotOptions[this.type].tooltip, c.tooltip.userOptions, d.series && d.series.tooltip, d[this.type].tooltip, a.tooltip);
                this.stickyTracking = H(a.stickyTracking, f[this.type] && f[this.type].stickyTracking, f.series && f.series.stickyTracking, this.tooltipOptions.shared && !this.noSharedTooltip ? !0 : b.stickyTracking);
                null === e.marker && delete b.marker;
                this.zoneAxis = b.zoneAxis;
                a = this.zones =
                    (b.zones || []).slice();
                !b.negativeColor && !b.negativeFillColor || b.zones || a.push({
                    value: b[this.zoneAxis + "Threshold"] || b.threshold || 0,
                    className: "highcharts-negative",
                    color: b.negativeColor,
                    fillColor: b.negativeFillColor
                });
                a.length && v(a[a.length - 1].value) && a.push({color: this.color, fillColor: this.fillColor});
                return b
            },
            getCyclic: function (a, b, c) {
                var d, f = this.chart, e = this.userOptions, p = a + "Index", h = a + "Counter", l = c ? c.length : H(f.options.chart[a + "Count"], f[a + "Count"]);
                b || (d = H(e[p], e["_" + p]), v(d) || (f.series.length ||
                (f[h] = 0), e["_" + p] = d = f[h] % l, f[h] += 1), c && (b = c[d]));
                void 0 !== d && (this[p] = d);
                this[a] = b
            },
            getColor: function () {
                this.options.colorByPoint ? this.options.color = null : this.getCyclic("color", this.options.color || q[this.type].color, this.chart.options.colors)
            },
            getSymbol: function () {
                this.getCyclic("symbol", this.options.marker.symbol, this.chart.options.symbols)
            },
            drawLegendSymbol: a.LegendSymbolMixin.drawLineMarker,
            setData: function (d, e, h, l) {
                var f = this, p = f.points, g = p && p.length || 0, r, n = f.options, k = f.chart, m = null, q = f.xAxis,
                    E = n.turboThreshold, z = this.xData, y = this.yData, I = (r = f.pointArrayMap) && r.length;
                d = d || [];
                r = d.length;
                e = H(e, !0);
                if (!1 !== l && r && g === r && !f.cropped && !f.hasGroupedData && f.visible)u(d, function (a, b) {
                    p[b].update && a !== n.data[b] && p[b].update(a, !1, null, !1)
                }); else {
                    f.xIncrement = null;
                    f.colorCounter = 0;
                    u(this.parallelArrays, function (a) {
                        f[a + "Data"].length = 0
                    });
                    if (E && r > E) {
                        for (h = 0; null === m && h < r;)m = d[h], h++;
                        if (w(m))for (h = 0; h < r; h++)z[h] = this.autoIncrement(), y[h] = d[h]; else if (c(m))if (I)for (h = 0; h < r; h++)m = d[h], z[h] = m[0], y[h] = m.slice(1,
                            I + 1); else for (h = 0; h < r; h++)m = d[h], z[h] = m[0], y[h] = m[1]; else a.error(12)
                    } else for (h = 0; h < r; h++)void 0 !== d[h] && (m = {series: f}, f.pointClass.prototype.applyOptions.apply(m, [d[h]]), f.updateParallelArrays(m, h));
                    b(y[0]) && a.error(14, !0);
                    f.data = [];
                    f.options.data = f.userOptions.data = d;
                    for (h = g; h--;)p[h] && p[h].destroy && p[h].destroy();
                    q && (q.minRange = q.userMinRange);
                    f.isDirty = k.isDirtyBox = !0;
                    f.isDirtyData = !!p;
                    h = !1
                }
                "point" === n.legendType && (this.processData(), this.generatePoints());
                e && k.redraw(h)
            },
            processData: function (b) {
                var c =
                    this.xData, d = this.yData, e = c.length, f;
                f = 0;
                var h, p, l = this.xAxis, g, r = this.options;
                g = r.cropThreshold;
                var n = this.getExtremesFromAll || r.getExtremesFromAll, k = this.isCartesian, r = l && l.val2lin, m = l && l.isLog, q, w;
                if (k && !this.isDirty && !l.isDirty && !this.yAxis.isDirty && !b)return !1;
                l && (b = l.getExtremes(), q = b.min, w = b.max);
                if (k && this.sorted && !n && (!g || e > g || this.forceCrop))if (c[e - 1] < q || c[0] > w)c = [], d = []; else if (c[0] < q || c[e - 1] > w)f = this.cropData(this.xData, this.yData, q, w), c = f.xData, d = f.yData, f = f.start, h = !0;
                for (g = c.length ||
                    1; --g;)e = m ? r(c[g]) - r(c[g - 1]) : c[g] - c[g - 1], 0 < e && (void 0 === p || e < p) ? p = e : 0 > e && this.requireSorting && a.error(15);
                this.cropped = h;
                this.cropStart = f;
                this.processedXData = c;
                this.processedYData = d;
                this.closestPointRange = p
            },
            cropData: function (a, b, c, d) {
                var f = a.length, e = 0, h = f, p = H(this.cropShoulder, 1), l;
                for (l = 0; l < f; l++)if (a[l] >= c) {
                    e = Math.max(0, l - p);
                    break
                }
                for (c = l; c < f; c++)if (a[c] > d) {
                    h = c + p;
                    break
                }
                return {xData: a.slice(e, h), yData: b.slice(e, h), start: e, end: h}
            },
            generatePoints: function () {
                var a = this.options, b = a.data, c = this.data,
                    d, f = this.processedXData, e = this.processedYData, h = this.pointClass, l = f.length, g = this.cropStart || 0, r, n = this.hasGroupedData, a = a.keys, k, m = [], q;
                c || n || (c = [], c.length = b.length, c = this.data = c);
                a && n && (this.options.keys = !1);
                for (q = 0; q < l; q++)r = g + q, n ? (k = (new h).init(this, [f[q]].concat(B(e[q]))), k.dataGroup = this.groupMap[q]) : (k = c[r]) || void 0 === b[r] || (c[r] = k = (new h).init(this, b[r], f[q])), k && (k.index = r, m[q] = k);
                this.options.keys = a;
                if (c && (l !== (d = c.length) || n))for (q = 0; q < d; q++)q !== g || n || (q += l), c[q] && (c[q].destroyElements(),
                    c[q].plotX = void 0);
                this.data = c;
                this.points = m
            },
            getExtremes: function (a) {
                var b = this.yAxis, d = this.processedXData, e, f = [], h = 0;
                e = this.xAxis.getExtremes();
                var p = e.min, l = e.max, g, r, n, k;
                a = a || this.stackedYData || this.processedYData || [];
                e = a.length;
                for (k = 0; k < e; k++)if (r = d[k], n = a[k], g = (w(n, !0) || c(n)) && (!b.positiveValuesOnly || n.length || 0 < n), r = this.getExtremesFromAll || this.options.getExtremesFromAll || this.cropped || (d[k] || r) >= p && (d[k] || r) <= l, g && r)if (g = n.length)for (; g--;)null !== n[g] && (f[h++] = n[g]); else f[h++] = n;
                this.dataMin =
                    F(f);
                this.dataMax = G(f)
            },
            translate: function () {
                this.processedXData || this.processData();
                this.generatePoints();
                var a = this.options, b = a.stacking, c = this.xAxis, d = c.categories, f = this.yAxis, e = this.points, h = e.length, l = !!this.modifyValue, g = a.pointPlacement, r = "between" === g || w(g), n = a.threshold, k = a.startFromThreshold ? n : 0, q, z, y, B, u = Number.MAX_VALUE;
                "between" === g && (g = .5);
                w(g) && (g *= H(a.pointRange || c.pointRange));
                for (a = 0; a < h; a++) {
                    var D = e[a], M = D.x, A = D.y;
                    z = D.low;
                    var C = b && f.stacks[(this.negStacks && A < (k ? 0 : n) ? "-" : "") + this.stackKey],
                        F;
                    f.positiveValuesOnly && null !== A && 0 >= A && (D.isNull = !0);
                    D.plotX = q = m(Math.min(Math.max(-1E5, c.translate(M, 0, 0, 0, 1, g, "flags" === this.type)), 1E5));
                    b && this.visible && !D.isNull && C && C[M] && (B = this.getStackIndicator(B, M, this.index), F = C[M], A = F.points[B.key], z = A[0], A = A[1], z === k && B.key === C[M].base && (z = H(n, f.min)), f.positiveValuesOnly && 0 >= z && (z = null), D.total = D.stackTotal = F.total, D.percentage = F.total && D.y / F.total * 100, D.stackY = A, F.setOffset(this.pointXOffset || 0, this.barW || 0));
                    D.yBottom = v(z) ? f.translate(z, 0, 1, 0, 1) :
                        null;
                    l && (A = this.modifyValue(A, D));
                    D.plotY = z = "number" === typeof A && Infinity !== A ? Math.min(Math.max(-1E5, f.translate(A, 0, 1, 0, 1)), 1E5) : void 0;
                    D.isInside = void 0 !== z && 0 <= z && z <= f.len && 0 <= q && q <= c.len;
                    D.clientX = r ? m(c.translate(M, 0, 0, 0, 1, g)) : q;
                    D.negative = D.y < (n || 0);
                    D.category = d && void 0 !== d[D.x] ? d[D.x] : D.x;
                    D.isNull || (void 0 !== y && (u = Math.min(u, Math.abs(q - y))), y = q);
                    D.zone = this.zones.length && D.getZone()
                }
                this.closestPointRangePx = u
            },
            getValidPoints: function (a, b) {
                var c = this.chart;
                return d(a || this.points || [], function (a) {
                    return b && !c.isInsidePlot(a.plotX, a.plotY, c.inverted) ? !1 : !a.isNull
                })
            },
            setClip: function (a) {
                var b = this.chart, c = this.options, d = b.renderer, f = b.inverted, e = this.clipBox, h = e || b.clipBox, l = this.sharedClipKey || ["_sharedClip", a && a.duration, a && a.easing, h.height, c.xAxis, c.yAxis].join(), g = b[l], p = b[l + "m"];
                g || (a && (h.width = 0, b[l + "m"] = p = d.clipRect(-99, f ? -b.plotLeft : -b.plotTop, 99, f ? b.chartWidth : b.chartHeight)), b[l] = g = d.clipRect(h), g.count = {length: 0});
                a && !g.count[this.index] && (g.count[this.index] = !0, g.count.length += 1);
                !1 !== c.clip &&
                (this.group.clip(a || e ? g : b.clipRect), this.markerGroup.clip(p), this.sharedClipKey = l);
                a || (g.count[this.index] && (delete g.count[this.index], --g.count.length), 0 === g.count.length && l && b[l] && (e || (b[l] = b[l].destroy()), b[l + "m"] && (b[l + "m"] = b[l + "m"].destroy())))
            },
            animate: function (a) {
                var b = this.chart, c = A(this.options.animation), d;
                a ? this.setClip(c) : (d = this.sharedClipKey, (a = b[d]) && a.animate({width: b.plotSizeX}, c), b[d + "m"] && b[d + "m"].animate({width: b.plotSizeX + 99}, c), this.animate = null)
            },
            afterAnimate: function () {
                this.setClip();
                n(this, "afterAnimate")
            },
            drawPoints: function () {
                var a = this.points, b = this.chart, c, d, f, e, h = this.options.marker, l, g, r, n, k = this[this.specialGroup] || this.markerGroup, m = H(h.enabled, this.xAxis.isRadial ? !0 : null, this.closestPointRangePx >= 2 * h.radius);
                if (!1 !== h.enabled || this._hasPointMarkers)for (d = 0; d < a.length; d++)f = a[d], c = f.plotY, e = f.graphic, l = f.marker || {}, g = !!f.marker, r = m && void 0 === l.enabled || l.enabled, n = f.isInside, r && w(c) && null !== f.y ? (c = H(l.symbol, this.symbol), f.hasImage = 0 === c.indexOf("url"), r = this.markerAttribs(f,
                    f.selected && "select"), e ? e[n ? "show" : "hide"](!0).animate(r) : n && (0 < r.width || f.hasImage) && (f.graphic = e = b.renderer.symbol(c, r.x, r.y, r.width, r.height, g ? l : h).add(k)), e && e.attr(this.pointAttribs(f, f.selected && "select")), e && e.addClass(f.getClassName(), !0)) : e && (f.graphic = e.destroy())
            },
            markerAttribs: function (a, b) {
                var c = this.options.marker, d = a.marker || {}, f = H(d.radius, c.radius);
                b && (c = c.states[b], b = d.states && d.states[b], f = H(b && b.radius, c && c.radius, f + (c && c.radiusPlus || 0)));
                a.hasImage && (f = 0);
                a = {
                    x: Math.floor(a.plotX) -
                    f, y: a.plotY - f
                };
                f && (a.width = a.height = 2 * f);
                return a
            },
            pointAttribs: function (a, b) {
                var c = this.options.marker, d = a && a.options, f = d && d.marker || {}, e = this.color, h = d && d.color, l = a && a.color, d = H(f.lineWidth, c.lineWidth);
                a = a && a.zone && a.zone.color;
                e = h || a || l || e;
                a = f.fillColor || c.fillColor || e;
                e = f.lineColor || c.lineColor || e;
                b && (c = c.states[b], b = f.states && f.states[b] || {}, d = H(b.lineWidth, c.lineWidth, d + H(b.lineWidthPlus, c.lineWidthPlus, 0)), a = b.fillColor || c.fillColor || a, e = b.lineColor || c.lineColor || e);
                return {
                    stroke: e, "stroke-width": d,
                    fill: a
                }
            },
            destroy: function () {
                var a = this, b = a.chart, c = /AppleWebKit\/533/.test(M.navigator.userAgent), d, f, e = a.data || [], g, k;
                n(a, "destroy");
                l(a);
                u(a.axisTypes || [], function (b) {
                    (k = a[b]) && k.series && (h(k.series, a), k.isDirty = k.forceRedraw = !0)
                });
                a.legendItem && a.chart.legend.destroyItem(a);
                for (f = e.length; f--;)(g = e[f]) && g.destroy && g.destroy();
                a.points = null;
                clearTimeout(a.animationTimeout);
                D(a, function (a, b) {
                    a instanceof r && !a.survive && (d = c && "group" === b ? "hide" : "destroy", a[d]())
                });
                b.hoverSeries === a && (b.hoverSeries =
                    null);
                h(b.series, a);
                b.orderSeries();
                D(a, function (b, c) {
                    delete a[c]
                })
            },
            getGraphPath: function (a, b, c) {
                var d = this, f = d.options, e = f.step, h, l = [], g = [], p;
                a = a || d.points;
                (h = a.reversed) && a.reverse();
                (e = {right: 1, center: 2}[e] || e && 3) && h && (e = 4 - e);
                !f.connectNulls || b || c || (a = this.getValidPoints(a));
                u(a, function (h, r) {
                    var n = h.plotX, k = h.plotY, m = a[r - 1];
                    (h.leftCliff || m && m.rightCliff) && !c && (p = !0);
                    h.isNull && !v(b) && 0 < r ? p = !f.connectNulls : h.isNull && !b ? p = !0 : (0 === r || p ? r = ["M", h.plotX, h.plotY] : d.getPointSpline ? r = d.getPointSpline(a,
                        h, r) : e ? (r = 1 === e ? ["L", m.plotX, k] : 2 === e ? ["L", (m.plotX + n) / 2, m.plotY, "L", (m.plotX + n) / 2, k] : ["L", n, m.plotY], r.push("L", n, k)) : r = ["L", n, k], g.push(h.x), e && g.push(h.x), l.push.apply(l, r), p = !1)
                });
                l.xMap = g;
                return d.graphPath = l
            },
            drawGraph: function () {
                var a = this, b = this.options, c = (this.gappedPath || this.getGraphPath).call(this), d = [["graph", "highcharts-graph", b.lineColor || this.color, b.dashStyle]];
                u(this.zones, function (c, e) {
                    d.push(["zone-graph-" + e, "highcharts-graph highcharts-zone-graph-" + e + " " + (c.className || ""), c.color ||
                    a.color, c.dashStyle || b.dashStyle])
                });
                u(d, function (f, d) {
                    var e = f[0], h = a[e];
                    h ? (h.endX = c.xMap, h.animate({d: c})) : c.length && (a[e] = a.chart.renderer.path(c).addClass(f[1]).attr({zIndex: 1}).add(a.group), h = {
                        stroke: f[2],
                        "stroke-width": b.lineWidth,
                        fill: a.fillGraph && a.color || "none"
                    }, f[3] ? h.dashstyle = f[3] : "square" !== b.linecap && (h["stroke-linecap"] = h["stroke-linejoin"] = "round"), h = a[e].attr(h).shadow(2 > d && b.shadow));
                    h && (h.startX = c.xMap, h.isArea = c.isArea)
                })
            },
            applyZones: function () {
                var a = this, b = this.chart, c = b.renderer,
                    d = this.zones, f, e, h = this.clips || [], l, g = this.graph, r = this.area, n = Math.max(b.chartWidth, b.chartHeight), k = this[(this.zoneAxis || "y") + "Axis"], m, q, w = b.inverted, z, y, B, v, D = !1;
                d.length && (g || r) && k && void 0 !== k.min && (q = k.reversed, z = k.horiz, g && g.hide(), r && r.hide(), m = k.getExtremes(), u(d, function (d, p) {
                    f = q ? z ? b.plotWidth : 0 : z ? 0 : k.toPixels(m.min);
                    f = Math.min(Math.max(H(e, f), 0), n);
                    e = Math.min(Math.max(Math.round(k.toPixels(H(d.value, m.max), !0)), 0), n);
                    D && (f = e = k.toPixels(m.max));
                    y = Math.abs(f - e);
                    B = Math.min(f, e);
                    v = Math.max(f,
                        e);
                    k.isXAxis ? (l = {
                        x: w ? v : B,
                        y: 0,
                        width: y,
                        height: n
                    }, z || (l.x = b.plotHeight - l.x)) : (l = {
                        x: 0,
                        y: w ? v : B,
                        width: n,
                        height: y
                    }, z && (l.y = b.plotWidth - l.y));
                    w && c.isVML && (l = k.isXAxis ? {
                        x: 0,
                        y: q ? B : v,
                        height: l.width,
                        width: b.chartWidth
                    } : {x: l.y - b.plotLeft - b.spacingBox.x, y: 0, width: l.height, height: b.chartHeight});
                    h[p] ? h[p].animate(l) : (h[p] = c.clipRect(l), g && a["zone-graph-" + p].clip(h[p]), r && a["zone-area-" + p].clip(h[p]));
                    D = d.value > m.max
                }), this.clips = h)
            },
            invertGroups: function (a) {
                function b() {
                    u(["group", "markerGroup"], function (b) {
                        c[b] &&
                        (d.renderer.isVML && c[b].attr({
                            width: c.yAxis.len,
                            height: c.xAxis.len
                        }), c[b].width = c.yAxis.len, c[b].height = c.xAxis.len, c[b].invert(a))
                    })
                }

                var c = this, d = c.chart, f;
                c.xAxis && (f = C(d, "resize", b), C(c, "destroy", f), b(a), c.invertGroups = b)
            },
            plotGroup: function (a, b, c, d, f) {
                var e = this[a], h = !e;
                h && (this[a] = e = this.chart.renderer.g().attr({zIndex: d || .1}).add(f));
                e.addClass("highcharts-" + b + " highcharts-series-" + this.index + " highcharts-" + this.type + "-series highcharts-color-" + this.colorIndex + " " + (this.options.className || ""),
                    !0);
                e.attr({visibility: c})[h ? "attr" : "animate"](this.getPlotBox());
                return e
            },
            getPlotBox: function () {
                var a = this.chart, b = this.xAxis, c = this.yAxis;
                a.inverted && (b = c, c = this.xAxis);
                return {translateX: b ? b.left : a.plotLeft, translateY: c ? c.top : a.plotTop, scaleX: 1, scaleY: 1}
            },
            render: function () {
                var a = this, b = a.chart, c, d = a.options, f = !!a.animate && b.renderer.isSVG && A(d.animation).duration, e = a.visible ? "inherit" : "hidden", h = d.zIndex, l = a.hasRendered, g = b.seriesGroup, r = b.inverted;
                c = a.plotGroup("group", "series", e, h, g);
                a.markerGroup =
                    a.plotGroup("markerGroup", "markers", e, h, g);
                f && a.animate(!0);
                c.inverted = a.isCartesian ? r : !1;
                a.drawGraph && (a.drawGraph(), a.applyZones());
                a.drawDataLabels && a.drawDataLabels();
                a.visible && a.drawPoints();
                a.drawTracker && !1 !== a.options.enableMouseTracking && a.drawTracker();
                a.invertGroups(r);
                !1 === d.clip || a.sharedClipKey || l || c.clip(b.clipRect);
                f && a.animate();
                l || (a.animationTimeout = z(function () {
                    a.afterAnimate()
                }, f));
                a.isDirty = !1;
                a.hasRendered = !0
            },
            redraw: function () {
                var a = this.chart, b = this.isDirty || this.isDirtyData,
                    c = this.group, d = this.xAxis, f = this.yAxis;
                c && (a.inverted && c.attr({
                    width: a.plotWidth,
                    height: a.plotHeight
                }), c.animate({translateX: H(d && d.left, a.plotLeft), translateY: H(f && f.top, a.plotTop)}));
                this.translate();
                this.render();
                b && delete this.kdTree
            },
            kdAxisArray: ["clientX", "plotY"],
            searchPoint: function (a, b) {
                var c = this.xAxis, d = this.yAxis, f = this.chart.inverted;
                return this.searchKDTree({
                    clientX: f ? c.len - a.chartY + c.pos : a.chartX - c.pos,
                    plotY: f ? d.len - a.chartX + d.pos : a.chartY - d.pos
                }, b)
            },
            buildKDTree: function () {
                function a(c,
                           f, d) {
                    var e, h;
                    if (h = c && c.length)return e = b.kdAxisArray[f % d], c.sort(function (a, b) {
                        return a[e] - b[e]
                    }), h = Math.floor(h / 2), {
                        point: c[h],
                        left: a(c.slice(0, h), f + 1, d),
                        right: a(c.slice(h + 1), f + 1, d)
                    }
                }

                this.buildingKdTree = !0;
                var b = this, c = -1 < b.options.findNearestPointBy.indexOf("y") ? 2 : 1;
                delete b.kdTree;
                z(function () {
                    b.kdTree = a(b.getValidPoints(null, !b.directTouch), c, c);
                    b.buildingKdTree = !1
                }, b.options.kdNow ? 0 : 1)
            },
            searchKDTree: function (a, b) {
                function c(a, b, l, g) {
                    var r = b.point, p = d.kdAxisArray[l % g], n, k, m = r;
                    k = v(a[f]) && v(r[f]) ?
                        Math.pow(a[f] - r[f], 2) : null;
                    n = v(a[e]) && v(r[e]) ? Math.pow(a[e] - r[e], 2) : null;
                    n = (k || 0) + (n || 0);
                    r.dist = v(n) ? Math.sqrt(n) : Number.MAX_VALUE;
                    r.distX = v(k) ? Math.sqrt(k) : Number.MAX_VALUE;
                    p = a[p] - r[p];
                    n = 0 > p ? "left" : "right";
                    k = 0 > p ? "right" : "left";
                    b[n] && (n = c(a, b[n], l + 1, g), m = n[h] < m[h] ? n : r);
                    b[k] && Math.sqrt(p * p) < m[h] && (a = c(a, b[k], l + 1, g), m = a[h] < m[h] ? a : m);
                    return m
                }

                var d = this, f = this.kdAxisArray[0], e = this.kdAxisArray[1], h = b ? "distX" : "dist";
                b = -1 < d.options.findNearestPointBy.indexOf("y") ? 2 : 1;
                this.kdTree || this.buildingKdTree ||
                this.buildKDTree();
                if (this.kdTree)return c(a, this.kdTree, b, b)
            }
        })
    })(K);
    (function (a) {
        function C(a, e, g, d, c) {
            var h = a.chart.inverted;
            this.axis = a;
            this.isNegative = g;
            this.options = e;
            this.x = d;
            this.total = null;
            this.points = {};
            this.stack = c;
            this.rightCliff = this.leftCliff = 0;
            this.alignOptions = {
                align: e.align || (h ? g ? "left" : "right" : "center"),
                verticalAlign: e.verticalAlign || (h ? "middle" : g ? "bottom" : "top"),
                y: u(e.y, h ? 4 : g ? 14 : -6),
                x: u(e.x, h ? g ? -6 : 6 : 0)
            };
            this.textAlign = e.textAlign || (h ? g ? "right" : "left" : "center")
        }

        var A = a.Axis, G = a.Chart,
            F = a.correctFloat, m = a.defined, g = a.destroyObjectProperties, k = a.each, q = a.format, v = a.objectEach, u = a.pick;
        a = a.Series;
        C.prototype = {
            destroy: function () {
                g(this, this.axis)
            }, render: function (a) {
                var e = this.options, h = e.format, h = h ? q(h, this) : e.formatter.call(this);
                this.label ? this.label.attr({
                    text: h,
                    visibility: "hidden"
                }) : this.label = this.axis.chart.renderer.text(h, null, null, e.useHTML).css(e.style).attr({
                    align: this.textAlign,
                    rotation: e.rotation,
                    visibility: "hidden"
                }).add(a)
            }, setOffset: function (a, e) {
                var h = this.axis, d =
                    h.chart, c = d.inverted, g = h.reversed, g = this.isNegative && !g || !this.isNegative && g, b = h.translate(h.usePercentage ? 100 : this.total, 0, 0, 0, 1), h = h.translate(0), h = Math.abs(b - h);
                a = d.xAxis[0].translate(this.x) + a;
                var k = d.plotHeight, c = {
                    x: c ? g ? b : b - h : a,
                    y: c ? k - a - e : g ? k - b - h : k - b,
                    width: c ? h : e,
                    height: c ? e : h
                };
                if (e = this.label)e.align(this.alignOptions, null, c), c = e.alignAttr, e[!1 === this.options.crop || d.isInsidePlot(c.x, c.y) ? "show" : "hide"](!0)
            }
        };
        G.prototype.getStacks = function () {
            var a = this;
            k(a.yAxis, function (a) {
                a.stacks && a.hasVisibleSeries &&
                (a.oldStacks = a.stacks)
            });
            k(a.series, function (e) {
                !e.options.stacking || !0 !== e.visible && !1 !== a.options.chart.ignoreHiddenSeries || (e.stackKey = e.type + u(e.options.stack, ""))
            })
        };
        A.prototype.buildStacks = function () {
            var a = this.series, e, g = u(this.options.reversedStacks, !0), d = a.length, c;
            if (!this.isXAxis) {
                this.usePercentage = !1;
                for (c = d; c--;)a[g ? c : d - c - 1].setStackedPoints();
                for (c = d; c--;)e = a[g ? c : d - c - 1], e.setStackCliffs && e.setStackCliffs();
                if (this.usePercentage)for (c = 0; c < d; c++)a[c].setPercentStacks()
            }
        };
        A.prototype.renderStackTotals =
            function () {
                var a = this.chart, e = a.renderer, g = this.stacks, d = this.stackTotalGroup;
                d || (this.stackTotalGroup = d = e.g("stack-labels").attr({visibility: "visible", zIndex: 6}).add());
                d.translate(a.plotLeft, a.plotTop);
                v(g, function (a) {
                    v(a, function (a) {
                        a.render(d)
                    })
                })
            };
        A.prototype.resetStacks = function () {
            var a = this, e = a.stacks;
            a.isXAxis || v(e, function (e) {
                v(e, function (d, c) {
                    d.touched < a.stacksTouched ? (d.destroy(), delete e[c]) : (d.total = null, d.cum = null)
                })
            })
        };
        A.prototype.cleanStacks = function () {
            var a;
            this.isXAxis || (this.oldStacks &&
            (a = this.stacks = this.oldStacks), v(a, function (a) {
                v(a, function (a) {
                    a.cum = a.total
                })
            }))
        };
        a.prototype.setStackedPoints = function () {
            if (this.options.stacking && (!0 === this.visible || !1 === this.chart.options.chart.ignoreHiddenSeries)) {
                var a = this.processedXData, e = this.processedYData, g = [], d = e.length, c = this.options, k = c.threshold, b = c.startFromThreshold ? k : 0, q = c.stack, c = c.stacking, v = this.stackKey, H = "-" + v, l = this.negStacks, B = this.yAxis, r = B.stacks, z = B.oldStacks, M, p, E, I, A, f, t;
                B.stacksTouched += 1;
                for (A = 0; A < d; A++)f = a[A], t = e[A],
                    M = this.getStackIndicator(M, f, this.index), I = M.key, E = (p = l && t < (b ? 0 : k)) ? H : v, r[E] || (r[E] = {}), r[E][f] || (z[E] && z[E][f] ? (r[E][f] = z[E][f], r[E][f].total = null) : r[E][f] = new C(B, B.options.stackLabels, p, f, q)), E = r[E][f], null !== t && (E.points[I] = E.points[this.index] = [u(E.cum, b)], m(E.cum) || (E.base = I), E.touched = B.stacksTouched, 0 < M.index && !1 === this.singleStacks && (E.points[I][0] = E.points[this.index + "," + f + ",0"][0])), "percent" === c ? (p = p ? v : H, l && r[p] && r[p][f] ? (p = r[p][f], E.total = p.total = Math.max(p.total, E.total) + Math.abs(t) ||
                    0) : E.total = F(E.total + (Math.abs(t) || 0))) : E.total = F(E.total + (t || 0)), E.cum = u(E.cum, b) + (t || 0), null !== t && (E.points[I].push(E.cum), g[A] = E.cum);
                "percent" === c && (B.usePercentage = !0);
                this.stackedYData = g;
                B.oldStacks = {}
            }
        };
        a.prototype.setPercentStacks = function () {
            var a = this, e = a.stackKey, g = a.yAxis.stacks, d = a.processedXData, c;
            k([e, "-" + e], function (e) {
                for (var b = d.length, h, k; b--;)if (h = d[b], c = a.getStackIndicator(c, h, a.index, e), h = (k = g[e] && g[e][h]) && k.points[c.key])k = k.total ? 100 / k.total : 0, h[0] = F(h[0] * k), h[1] = F(h[1] * k),
                    a.stackedYData[b] = h[1]
            })
        };
        a.prototype.getStackIndicator = function (a, e, g, d) {
            !m(a) || a.x !== e || d && a.key !== d ? a = {x: e, index: 0, key: d} : a.index++;
            a.key = [g, e, a.index].join();
            return a
        }
    })(K);
    (function (a) {
        var C = a.addEvent, A = a.animate, G = a.Axis, F = a.createElement, m = a.css, g = a.defined, k = a.each, q = a.erase, v = a.extend, u = a.fireEvent, h = a.inArray, e = a.isNumber, n = a.isObject, d = a.isArray, c = a.merge, w = a.objectEach, b = a.pick, y = a.Point, D = a.Series, H = a.seriesTypes, l = a.setAnimation, B = a.splat;
        v(a.Chart.prototype, {
            addSeries: function (a, c,
                                 d) {
                var e, h = this;
                a && (c = b(c, !0), u(h, "addSeries", {options: a}, function () {
                    e = h.initSeries(a);
                    h.isDirtyLegend = !0;
                    h.linkSeries();
                    c && h.redraw(d)
                }));
                return e
            },
            addAxis: function (a, d, e, h) {
                var g = d ? "xAxis" : "yAxis", l = this.options;
                a = c(a, {index: this[g].length, isX: d});
                new G(this, a);
                l[g] = B(l[g] || {});
                l[g].push(a);
                b(e, !0) && this.redraw(h)
            },
            showLoading: function (a) {
                var b = this, c = b.options, d = b.loadingDiv, e = c.loading, h = function () {
                    d && m(d, {
                        left: b.plotLeft + "px",
                        top: b.plotTop + "px",
                        width: b.plotWidth + "px",
                        height: b.plotHeight + "px"
                    })
                };
                d || (b.loadingDiv = d = F("div", {className: "highcharts-loading highcharts-loading-hidden"}, null, b.container), b.loadingSpan = F("span", {className: "highcharts-loading-inner"}, null, d), C(b, "redraw", h));
                d.className = "highcharts-loading";
                b.loadingSpan.innerHTML = a || c.lang.loading;
                m(d, v(e.style, {zIndex: 10}));
                m(b.loadingSpan, e.labelStyle);
                b.loadingShown || (m(d, {
                    opacity: 0,
                    display: ""
                }), A(d, {opacity: e.style.opacity || .5}, {duration: e.showDuration || 0}));
                b.loadingShown = !0;
                h()
            },
            hideLoading: function () {
                var a = this.options, b =
                    this.loadingDiv;
                b && (b.className = "highcharts-loading highcharts-loading-hidden", A(b, {opacity: 0}, {
                    duration: a.loading.hideDuration || 100,
                    complete: function () {
                        m(b, {display: "none"})
                    }
                }));
                this.loadingShown = !1
            },
            propsRequireDirtyBox: "backgroundColor borderColor borderWidth margin marginTop marginRight marginBottom marginLeft spacing spacingTop spacingRight spacingBottom spacingLeft borderRadius plotBackgroundColor plotBackgroundImage plotBorderColor plotBorderWidth plotShadow shadow".split(" "),
            propsRequireUpdateSeries: "chart.inverted chart.polar chart.ignoreHiddenSeries chart.type colors plotOptions tooltip".split(" "),
            update: function (a, d) {
                var l = this, r = {
                    credits: "addCredits",
                    title: "setTitle",
                    subtitle: "setSubtitle"
                }, n = a.chart, m, q;
                if (n) {
                    c(!0, l.options.chart, n);
                    "className" in n && l.setClassName(n.className);
                    if ("inverted" in n || "polar" in n)l.propFromSeries(), m = !0;
                    "alignTicks" in n && (m = !0);
                    w(n, function (a, b) {
                        -1 !== h("chart." + b, l.propsRequireUpdateSeries) && (q = !0);
                        -1 !== h(b, l.propsRequireDirtyBox) && (l.isDirtyBox = !0)
                    });
                    "style" in n && l.renderer.setStyle(n.style)
                }
                a.colors && (this.options.colors = a.colors);
                a.plotOptions && c(!0, this.options.plotOptions,
                    a.plotOptions);
                w(a, function (a, b) {
                    if (l[b] && "function" === typeof l[b].update)l[b].update(a, !1); else if ("function" === typeof l[r[b]])l[r[b]](a);
                    "chart" !== b && -1 !== h(b, l.propsRequireUpdateSeries) && (q = !0)
                });
                k("xAxis yAxis zAxis series colorAxis pane".split(" "), function (b) {
                    a[b] && k(B(a[b]), function (a, c) {
                        (c = g(a.id) && l.get(a.id) || l[b][c]) && c.coll === b && c.update(a, !1)
                    })
                });
                m && k(l.axes, function (a) {
                    a.update({}, !1)
                });
                q && k(l.series, function (a) {
                    a.update({}, !1)
                });
                a.loading && c(!0, l.options.loading, a.loading);
                m = n && n.width;
                n = n && n.height;
                e(m) && m !== l.chartWidth || e(n) && n !== l.chartHeight ? l.setSize(m, n) : b(d, !0) && l.redraw()
            },
            setSubtitle: function (a) {
                this.setTitle(void 0, a)
            }
        });
        v(y.prototype, {
            update: function (a, c, d, e) {
                function h() {
                    l.applyOptions(a);
                    null === l.y && f && (l.graphic = f.destroy());
                    n(a, !0) && (f && f.element && a && a.marker && a.marker.symbol && (l.graphic = f.destroy()), a && a.dataLabels && l.dataLabel && (l.dataLabel = l.dataLabel.destroy()));
                    r = l.index;
                    g.updateParallelArrays(l, r);
                    p.data[r] = n(p.data[r], !0) || n(a, !0) ? l.options : a;
                    g.isDirty = g.isDirtyData = !0;
                    !g.fixedBox && g.hasCartesianSeries && (k.isDirtyBox = !0);
                    "point" === p.legendType && (k.isDirtyLegend = !0);
                    c && k.redraw(d)
                }

                var l = this, g = l.series, f = l.graphic, r, k = g.chart, p = g.options;
                c = b(c, !0);
                !1 === e ? h() : l.firePointEvent("update", {options: a}, h)
            }, remove: function (a, b) {
                this.series.removePoint(h(this, this.series.data), a, b)
            }
        });
        v(D.prototype, {
            addPoint: function (a, c, d, e) {
                var h = this.options, l = this.data, g = this.chart, f = this.xAxis, f = f && f.hasNames && f.names, r = h.data, k, p, n = this.xData, m, q;
                c = b(c, !0);
                k = {series: this};
                this.pointClass.prototype.applyOptions.apply(k,
                    [a]);
                q = k.x;
                m = n.length;
                if (this.requireSorting && q < n[m - 1])for (p = !0; m && n[m - 1] > q;)m--;
                this.updateParallelArrays(k, "splice", m, 0, 0);
                this.updateParallelArrays(k, m);
                f && k.name && (f[q] = k.name);
                r.splice(m, 0, a);
                p && (this.data.splice(m, 0, null), this.processData());
                "point" === h.legendType && this.generatePoints();
                d && (l[0] && l[0].remove ? l[0].remove(!1) : (l.shift(), this.updateParallelArrays(k, "shift"), r.shift()));
                this.isDirtyData = this.isDirty = !0;
                c && g.redraw(e)
            }, removePoint: function (a, c, d) {
                var e = this, h = e.data, g = h[a], k = e.points,
                    f = e.chart, r = function () {
                        k && k.length === h.length && k.splice(a, 1);
                        h.splice(a, 1);
                        e.options.data.splice(a, 1);
                        e.updateParallelArrays(g || {series: e}, "splice", a, 1);
                        g && g.destroy();
                        e.isDirty = !0;
                        e.isDirtyData = !0;
                        c && f.redraw()
                    };
                l(d, f);
                c = b(c, !0);
                g ? g.firePointEvent("remove", null, r) : r()
            }, remove: function (a, c, d) {
                function e() {
                    h.destroy();
                    l.isDirtyLegend = l.isDirtyBox = !0;
                    l.linkSeries();
                    b(a, !0) && l.redraw(c)
                }

                var h = this, l = h.chart;
                !1 !== d ? u(h, "remove", null, e) : e()
            }, update: function (a, d) {
                var e = this, h = e.chart, l = e.userOptions, g =
                    e.oldType || e.type, r = a.type || l.type || h.options.chart.type, f = H[g].prototype, n = ["group", "markerGroup", "dataLabelsGroup"], m;
                if (Object.keys && "data" === Object.keys(a).toString())return this.setData(a.data, d);
                if (r && r !== g || void 0 !== a.zIndex)n.length = 0;
                k(n, function (a) {
                    n[a] = e[a];
                    delete e[a]
                });
                a = c(l, {animation: !1, index: e.index, pointStart: e.xData[0]}, {data: e.options.data}, a);
                e.remove(!1, null, !1);
                for (m in f)e[m] = void 0;
                v(e, H[r || g].prototype);
                k(n, function (a) {
                    e[a] = n[a]
                });
                e.init(h, a);
                e.oldType = g;
                h.linkSeries();
                b(d,
                    !0) && h.redraw(!1)
            }
        });
        v(G.prototype, {
            update: function (a, d) {
                var e = this.chart;
                a = e.options[this.coll][this.options.index] = c(this.userOptions, a);
                this.destroy(!0);
                this.init(e, v(a, {events: void 0}));
                e.isDirtyBox = !0;
                b(d, !0) && e.redraw()
            }, remove: function (a) {
                for (var c = this.chart, e = this.coll, h = this.series, l = h.length; l--;)h[l] && h[l].remove(!1);
                q(c.axes, this);
                q(c[e], this);
                d(c.options[e]) ? c.options[e].splice(this.options.index, 1) : delete c.options[e];
                k(c[e], function (a, b) {
                    a.options.index = b
                });
                this.destroy();
                c.isDirtyBox = !0;
                b(a, !0) && c.redraw()
            }, setTitle: function (a, b) {
                this.update({title: a}, b)
            }, setCategories: function (a, b) {
                this.update({categories: a}, b)
            }
        })
    })(K);
    (function (a) {
        var C = a.color, A = a.each, G = a.map, F = a.pick, m = a.Series, g = a.seriesType;
        g("area", "line", {softThreshold: !1, threshold: 0}, {
            singleStacks: !1, getStackPoints: function () {
                var g = [], m = [], v = this.xAxis, u = this.yAxis, h = u.stacks[this.stackKey], e = {}, n = this.points, d = this.index, c = u.series, w = c.length, b, y = F(u.options.reversedStacks, !0) ? 1 : -1, D;
                if (this.options.stacking) {
                    for (D =
                             0; D < n.length; D++)e[n[D].x] = n[D];
                    a.objectEach(h, function (a, b) {
                        null !== a.total && m.push(b)
                    });
                    m.sort(function (a, b) {
                        return a - b
                    });
                    b = G(c, function () {
                        return this.visible
                    });
                    A(m, function (a, c) {
                        var l = 0, k, n;
                        if (e[a] && !e[a].isNull)g.push(e[a]), A([-1, 1], function (l) {
                            var g = 1 === l ? "rightNull" : "leftNull", r = 0, q = h[m[c + l]];
                            if (q)for (D = d; 0 <= D && D < w;)k = q.points[D], k || (D === d ? e[a][g] = !0 : b[D] && (n = h[a].points[D]) && (r -= n[1] - n[0])), D += y;
                            e[a][1 === l ? "rightCliff" : "leftCliff"] = r
                        }); else {
                            for (D = d; 0 <= D && D < w;) {
                                if (k = h[a].points[D]) {
                                    l = k[1];
                                    break
                                }
                                D +=
                                    y
                            }
                            l = u.translate(l, 0, 1, 0, 1);
                            g.push({isNull: !0, plotX: v.translate(a, 0, 0, 0, 1), x: a, plotY: l, yBottom: l})
                        }
                    })
                }
                return g
            }, getGraphPath: function (a) {
                var g = m.prototype.getGraphPath, k = this.options, u = k.stacking, h = this.yAxis, e, n, d = [], c = [], w = this.index, b, y = h.stacks[this.stackKey], D = k.threshold, A = h.getThreshold(k.threshold), l, k = k.connectNulls || "percent" === u, B = function (e, l, g) {
                    var k = a[e];
                    e = u && y[k.x].points[w];
                    var n = k[g + "Null"] || 0;
                    g = k[g + "Cliff"] || 0;
                    var r, m, k = !0;
                    g || n ? (r = (n ? e[0] : e[1]) + g, m = e[0] + g, k = !!n) : !u && a[l] && a[l].isNull &&
                    (r = m = D);
                    void 0 !== r && (c.push({
                        plotX: b,
                        plotY: null === r ? A : h.getThreshold(r),
                        isNull: k,
                        isCliff: !0
                    }), d.push({plotX: b, plotY: null === m ? A : h.getThreshold(m), doCurve: !1}))
                };
                a = a || this.points;
                u && (a = this.getStackPoints());
                for (e = 0; e < a.length; e++)if (n = a[e].isNull, b = F(a[e].rectPlotX, a[e].plotX), l = F(a[e].yBottom, A), !n || k)k || B(e, e - 1, "left"), n && !u && k || (c.push(a[e]), d.push({
                    x: e,
                    plotX: b,
                    plotY: l
                })), k || B(e, e + 1, "right");
                e = g.call(this, c, !0, !0);
                d.reversed = !0;
                n = g.call(this, d, !0, !0);
                n.length && (n[0] = "L");
                n = e.concat(n);
                g = g.call(this,
                    c, !1, k);
                n.xMap = e.xMap;
                this.areaPath = n;
                return g
            }, drawGraph: function () {
                this.areaPath = [];
                m.prototype.drawGraph.apply(this);
                var a = this, g = this.areaPath, v = this.options, u = [["area", "highcharts-area", this.color, v.fillColor]];
                A(this.zones, function (h, e) {
                    u.push(["zone-area-" + e, "highcharts-area highcharts-zone-area-" + e + " " + h.className, h.color || a.color, h.fillColor || v.fillColor])
                });
                A(u, function (h) {
                    var e = h[0], k = a[e];
                    k ? (k.endX = g.xMap, k.animate({d: g})) : (k = a[e] = a.chart.renderer.path(g).addClass(h[1]).attr({
                        fill: F(h[3],
                            C(h[2]).setOpacity(F(v.fillOpacity, .75)).get()), zIndex: 0
                    }).add(a.group), k.isArea = !0);
                    k.startX = g.xMap;
                    k.shiftUnit = v.step ? 2 : 1
                })
            }, drawLegendSymbol: a.LegendSymbolMixin.drawRectangle
        })
    })(K);
    (function (a) {
        var C = a.pick;
        a = a.seriesType;
        a("spline", "line", {}, {
            getPointSpline: function (a, G, F) {
                var m = G.plotX, g = G.plotY, k = a[F - 1];
                F = a[F + 1];
                var q, v, u, h;
                if (k && !k.isNull && !1 !== k.doCurve && !G.isCliff && F && !F.isNull && !1 !== F.doCurve && !G.isCliff) {
                    a = k.plotY;
                    u = F.plotX;
                    F = F.plotY;
                    var e = 0;
                    q = (1.5 * m + k.plotX) / 2.5;
                    v = (1.5 * g + a) / 2.5;
                    u = (1.5 *
                        m + u) / 2.5;
                    h = (1.5 * g + F) / 2.5;
                    u !== q && (e = (h - v) * (u - m) / (u - q) + g - h);
                    v += e;
                    h += e;
                    v > a && v > g ? (v = Math.max(a, g), h = 2 * g - v) : v < a && v < g && (v = Math.min(a, g), h = 2 * g - v);
                    h > F && h > g ? (h = Math.max(F, g), v = 2 * g - h) : h < F && h < g && (h = Math.min(F, g), v = 2 * g - h);
                    G.rightContX = u;
                    G.rightContY = h
                }
                G = ["C", C(k.rightContX, k.plotX), C(k.rightContY, k.plotY), C(q, m), C(v, g), m, g];
                k.rightContX = k.rightContY = null;
                return G
            }
        })
    })(K);
    (function (a) {
        var C = a.seriesTypes.area.prototype, A = a.seriesType;
        A("areaspline", "spline", a.defaultPlotOptions.area, {
            getStackPoints: C.getStackPoints,
            getGraphPath: C.getGraphPath,
            setStackCliffs: C.setStackCliffs,
            drawGraph: C.drawGraph,
            drawLegendSymbol: a.LegendSymbolMixin.drawRectangle
        })
    })(K);
    (function (a) {
        var C = a.animObject, A = a.color, G = a.each, F = a.extend, m = a.isNumber, g = a.merge, k = a.pick, q = a.Series, v = a.seriesType, u = a.svg;
        v("column", "line", {
            borderRadius: 0,
            crisp: !0,
            groupPadding: .2,
            marker: null,
            pointPadding: .1,
            minPointLength: 0,
            cropThreshold: 50,
            pointRange: null,
            states: {
                hover: {halo: !1, brightness: .1, shadow: !1},
                select: {color: "#cccccc", borderColor: "#000000", shadow: !1}
            },
            dataLabels: {align: null, verticalAlign: null, y: null},
            softThreshold: !1,
            startFromThreshold: !0,
            stickyTracking: !1,
            tooltip: {distance: 6},
            threshold: 0,
            borderColor: "#ffffff"
        }, {
            cropShoulder: 0,
            directTouch: !0,
            trackerGroups: ["group", "dataLabelsGroup"],
            negStacks: !0,
            init: function () {
                q.prototype.init.apply(this, arguments);
                var a = this, e = a.chart;
                e.hasRendered && G(e.series, function (e) {
                    e.type === a.type && (e.isDirty = !0)
                })
            },
            getColumnMetrics: function () {
                var a = this, e = a.options, g = a.xAxis, d = a.yAxis, c = g.reversed, m, b = {}, q = 0;
                !1 === e.grouping ?
                    q = 1 : G(a.chart.series, function (c) {
                    var e = c.options, g = c.yAxis, h;
                    c.type !== a.type || !c.visible && a.chart.options.chart.ignoreHiddenSeries || d.len !== g.len || d.pos !== g.pos || (e.stacking ? (m = c.stackKey, void 0 === b[m] && (b[m] = q++), h = b[m]) : !1 !== e.grouping && (h = q++), c.columnIndex = h)
                });
                var u = Math.min(Math.abs(g.transA) * (g.ordinalSlope || e.pointRange || g.closestPointRange || g.tickInterval || 1), g.len), v = u * e.groupPadding, l = (u - 2 * v) / (q || 1), e = Math.min(e.maxPointWidth || g.len, k(e.pointWidth, l * (1 - 2 * e.pointPadding)));
                a.columnMetrics =
                {width: e, offset: (l - e) / 2 + (v + ((a.columnIndex || 0) + (c ? 1 : 0)) * l - u / 2) * (c ? -1 : 1)};
                return a.columnMetrics
            },
            crispCol: function (a, e, g, d) {
                var c = this.chart, h = this.borderWidth, b = -(h % 2 ? .5 : 0), h = h % 2 ? .5 : 1;
                c.inverted && c.renderer.isVML && (h += 1);
                this.options.crisp && (g = Math.round(a + g) + b, a = Math.round(a) + b, g -= a);
                d = Math.round(e + d) + h;
                b = .5 >= Math.abs(e) && .5 < d;
                e = Math.round(e) + h;
                d -= e;
                b && d && (--e, d += 1);
                return {x: a, y: e, width: g, height: d}
            },
            translate: function () {
                var a = this, e = a.chart, g = a.options, d = a.dense = 2 > a.closestPointRange * a.xAxis.transA,
                    d = a.borderWidth = k(g.borderWidth, d ? 0 : 1), c = a.yAxis, m = a.translatedThreshold = c.getThreshold(g.threshold), b = k(g.minPointLength, 5), y = a.getColumnMetrics(), u = y.width, v = a.barW = Math.max(u, 1 + 2 * d), l = a.pointXOffset = y.offset;
                e.inverted && (m -= .5);
                g.pointPadding && (v = Math.ceil(v));
                q.prototype.translate.apply(a);
                G(a.points, function (d) {
                    var g = k(d.yBottom, m), h = 999 + Math.abs(g), h = Math.min(Math.max(-h, d.plotY), c.len + h), n = d.plotX + l, p = v, q = Math.min(h, g), w, y = Math.max(h, g) - q;
                    Math.abs(y) < b && b && (y = b, w = !c.reversed && !d.negative ||
                        c.reversed && d.negative, q = Math.abs(q - m) > b ? g - b : m - (w ? b : 0));
                    d.barX = n;
                    d.pointWidth = u;
                    d.tooltipPos = e.inverted ? [c.len + c.pos - e.plotLeft - h, a.xAxis.len - n - p / 2, y] : [n + p / 2, h + c.pos - e.plotTop, y];
                    d.shapeType = "rect";
                    d.shapeArgs = a.crispCol.apply(a, d.isNull ? [n, m, p, 0] : [n, q, p, y])
                })
            },
            getSymbol: a.noop,
            drawLegendSymbol: a.LegendSymbolMixin.drawRectangle,
            drawGraph: function () {
                this.group[this.dense ? "addClass" : "removeClass"]("highcharts-dense-data")
            },
            pointAttribs: function (a, e) {
                var h = this.options, d, c = this.pointAttrToOptions || {};
                d = c.stroke || "borderColor";
                var k = c["stroke-width"] || "borderWidth", b = a && a.color || this.color, m = a[d] || h[d] || this.color || b, q = a[k] || h[k] || this[k] || 0, c = h.dashStyle;
                a && this.zones.length && (b = a.getZone(), b = a.options.color || b && b.color || this.color);
                e && (a = g(h.states[e], a.options.states && a.options.states[e] || {}), e = a.brightness, b = a.color || void 0 !== e && A(b).brighten(a.brightness).get() || b, m = a[d] || m, q = a[k] || q, c = a.dashStyle || c);
                d = {fill: b, stroke: m, "stroke-width": q};
                h.borderRadius && (d.r = h.borderRadius);
                c && (d.dashstyle =
                    c);
                return d
            },
            drawPoints: function () {
                var a = this, e = this.chart, k = a.options, d = e.renderer, c = k.animationLimit || 250, q;
                G(a.points, function (b) {
                    var h = b.graphic;
                    if (m(b.plotY) && null !== b.y) {
                        q = b.shapeArgs;
                        if (h)h[e.pointCount < c ? "animate" : "attr"](g(q)); else b.graphic = h = d[b.shapeType](q).add(b.group || a.group);
                        h.attr(a.pointAttribs(b, b.selected && "select")).shadow(k.shadow, null, k.stacking && !k.borderRadius);
                        h.addClass(b.getClassName(), !0)
                    } else h && (b.graphic = h.destroy())
                })
            },
            animate: function (a) {
                var e = this, g = this.yAxis,
                    d = e.options, c = this.chart.inverted, h = {};
                u && (a ? (h.scaleY = .001, a = Math.min(g.pos + g.len, Math.max(g.pos, g.toPixels(d.threshold))), c ? h.translateX = a - g.len : h.translateY = a, e.group.attr(h)) : (h[c ? "translateX" : "translateY"] = g.pos, e.group.animate(h, F(C(e.options.animation), {
                    step: function (a, c) {
                        e.group.attr({scaleY: Math.max(.001, c.pos)})
                    }
                })), e.animate = null))
            },
            remove: function () {
                var a = this, e = a.chart;
                e.hasRendered && G(e.series, function (e) {
                    e.type === a.type && (e.isDirty = !0)
                });
                q.prototype.remove.apply(a, arguments)
            }
        })
    })(K);
    (function (a) {
        a = a.seriesType;
        a("bar", "column", null, {inverted: !0})
    })(K);
    (function (a) {
        var C = a.Series;
        a = a.seriesType;
        a("scatter", "line", {
            lineWidth: 0,
            findNearestPointBy: "xy",
            marker: {enabled: !0},
            tooltip: {
                headerFormat: '\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cspan style\x3d"font-size: 0.85em"\x3e {series.name}\x3c/span\x3e\x3cbr/\x3e',
                pointFormat: "x: \x3cb\x3e{point.x}\x3c/b\x3e\x3cbr/\x3ey: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e"
            }
        }, {
            sorted: !1,
            requireSorting: !1,
            noSharedTooltip: !0,
            trackerGroups: ["group", "markerGroup", "dataLabelsGroup"],
            takeOrdinalPosition: !1,
            drawGraph: function () {
                this.options.lineWidth && C.prototype.drawGraph.call(this)
            }
        })
    })(K);
    (function (a) {
        var C = a.pick, A = a.relativeLength;
        a.CenteredSeriesMixin = {
            getCenter: function () {
                var a = this.options, F = this.chart, m = 2 * (a.slicedOffset || 0), g = F.plotWidth - 2 * m, F = F.plotHeight - 2 * m, k = a.center, k = [C(k[0], "50%"), C(k[1], "50%"), a.size || "100%", a.innerSize || 0], q = Math.min(g, F), v, u;
                for (v = 0; 4 > v; ++v)u = k[v], a = 2 > v || 2 === v && /%$/.test(u), k[v] = A(u, [g,
                        F, q, k[2]][v]) + (a ? m : 0);
                k[3] > k[2] && (k[3] = k[2]);
                return k
            }
        }
    })(K);
    (function (a) {
        var C = a.addEvent, A = a.defined, G = a.each, F = a.extend, m = a.inArray, g = a.noop, k = a.pick, q = a.Point, v = a.Series, u = a.seriesType, h = a.setAnimation;
        u("pie", "line", {
            center: [null, null],
            clip: !1,
            colorByPoint: !0,
            dataLabels: {
                distance: 30, enabled: !0, formatter: function () {
                    return this.point.isNull ? void 0 : this.point.name
                }, x: 0
            },
            ignoreHiddenPoint: !0,
            legendType: "point",
            marker: null,
            size: null,
            showInLegend: !1,
            slicedOffset: 10,
            stickyTracking: !1,
            tooltip: {followPointer: !0},
            borderColor: "#ffffff",
            borderWidth: 1,
            states: {hover: {brightness: .1, shadow: !1}}
        }, {
            isCartesian: !1,
            requireSorting: !1,
            directTouch: !0,
            noSharedTooltip: !0,
            trackerGroups: ["group", "dataLabelsGroup"],
            axisTypes: [],
            pointAttribs: a.seriesTypes.column.prototype.pointAttribs,
            animate: function (a) {
                var e = this, d = e.points, c = e.startAngleRad;
                a || (G(d, function (a) {
                    var b = a.graphic, d = a.shapeArgs;
                    b && (b.attr({r: a.startR || e.center[3] / 2, start: c, end: c}), b.animate({
                        r: d.r,
                        start: d.start,
                        end: d.end
                    }, e.options.animation))
                }), e.animate = null)
            },
            updateTotals: function () {
                var a, g = 0, d = this.points, c = d.length, h, b = this.options.ignoreHiddenPoint;
                for (a = 0; a < c; a++)h = d[a], g += b && !h.visible ? 0 : h.isNull ? 0 : h.y;
                this.total = g;
                for (a = 0; a < c; a++)h = d[a], h.percentage = 0 < g && (h.visible || !b) ? h.y / g * 100 : 0, h.total = g
            },
            generatePoints: function () {
                v.prototype.generatePoints.call(this);
                this.updateTotals()
            },
            translate: function (a) {
                this.generatePoints();
                var e = 0, d = this.options, c = d.slicedOffset, g = c + (d.borderWidth || 0), b, h, m, q = d.startAngle || 0, l = this.startAngleRad = Math.PI / 180 * (q - 90), q =
                    (this.endAngleRad = Math.PI / 180 * (k(d.endAngle, q + 360) - 90)) - l, u = this.points, r, z = d.dataLabels.distance, d = d.ignoreHiddenPoint, v, p = u.length, E;
                a || (this.center = a = this.getCenter());
                this.getX = function (b, c, d) {
                    m = Math.asin(Math.min((b - a[1]) / (a[2] / 2 + d.labelDistance), 1));
                    return a[0] + (c ? -1 : 1) * Math.cos(m) * (a[2] / 2 + d.labelDistance)
                };
                for (v = 0; v < p; v++) {
                    E = u[v];
                    E.labelDistance = k(E.options.dataLabels && E.options.dataLabels.distance, z);
                    this.maxLabelDistance = Math.max(this.maxLabelDistance || 0, E.labelDistance);
                    b = l + e * q;
                    if (!d || E.visible)e +=
                        E.percentage / 100;
                    h = l + e * q;
                    E.shapeType = "arc";
                    E.shapeArgs = {
                        x: a[0],
                        y: a[1],
                        r: a[2] / 2,
                        innerR: a[3] / 2,
                        start: Math.round(1E3 * b) / 1E3,
                        end: Math.round(1E3 * h) / 1E3
                    };
                    m = (h + b) / 2;
                    m > 1.5 * Math.PI ? m -= 2 * Math.PI : m < -Math.PI / 2 && (m += 2 * Math.PI);
                    E.slicedTranslation = {
                        translateX: Math.round(Math.cos(m) * c),
                        translateY: Math.round(Math.sin(m) * c)
                    };
                    h = Math.cos(m) * a[2] / 2;
                    r = Math.sin(m) * a[2] / 2;
                    E.tooltipPos = [a[0] + .7 * h, a[1] + .7 * r];
                    E.half = m < -Math.PI / 2 || m > Math.PI / 2 ? 1 : 0;
                    E.angle = m;
                    b = Math.min(g, E.labelDistance / 5);
                    E.labelPos = [a[0] + h + Math.cos(m) * E.labelDistance,
                        a[1] + r + Math.sin(m) * E.labelDistance, a[0] + h + Math.cos(m) * b, a[1] + r + Math.sin(m) * b, a[0] + h, a[1] + r, 0 > E.labelDistance ? "center" : E.half ? "right" : "left", m]
                }
            },
            drawGraph: null,
            drawPoints: function () {
                var a = this, g = a.chart.renderer, d, c, h, b, k = a.options.shadow;
                k && !a.shadowGroup && (a.shadowGroup = g.g("shadow").add(a.group));
                G(a.points, function (e) {
                    if (!e.isNull) {
                        c = e.graphic;
                        b = e.shapeArgs;
                        d = e.getTranslate();
                        var m = e.shadowGroup;
                        k && !m && (m = e.shadowGroup = g.g("shadow").add(a.shadowGroup));
                        m && m.attr(d);
                        h = a.pointAttribs(e, e.selected &&
                            "select");
                        c ? c.setRadialReference(a.center).attr(h).animate(F(b, d)) : (e.graphic = c = g[e.shapeType](b).setRadialReference(a.center).attr(d).add(a.group), e.visible || c.attr({visibility: "hidden"}), c.attr(h).attr({"stroke-linejoin": "round"}).shadow(k, m));
                        c.addClass(e.getClassName())
                    }
                })
            },
            searchPoint: g,
            sortByAngle: function (a, g) {
                a.sort(function (a, c) {
                    return void 0 !== a.angle && (c.angle - a.angle) * g
                })
            },
            drawLegendSymbol: a.LegendSymbolMixin.drawRectangle,
            getCenter: a.CenteredSeriesMixin.getCenter,
            getSymbol: g
        }, {
            init: function () {
                q.prototype.init.apply(this,
                    arguments);
                var a = this, g;
                a.name = k(a.name, "Slice");
                g = function (d) {
                    a.slice("select" === d.type)
                };
                C(a, "select", g);
                C(a, "unselect", g);
                return a
            }, isValid: function () {
                return a.isNumber(this.y, !0) && 0 <= this.y
            }, setVisible: function (a, g) {
                var d = this, c = d.series, e = c.chart, b = c.options.ignoreHiddenPoint;
                g = k(g, b);
                a !== d.visible && (d.visible = d.options.visible = a = void 0 === a ? !d.visible : a, c.options.data[m(d, c.data)] = d.options, G(["graphic", "dataLabel", "connector", "shadowGroup"], function (b) {
                    if (d[b])d[b][a ? "show" : "hide"](!0)
                }), d.legendItem &&
                e.legend.colorizeItem(d, a), a || "hover" !== d.state || d.setState(""), b && (c.isDirty = !0), g && e.redraw())
            }, slice: function (a, g, d) {
                var c = this.series;
                h(d, c.chart);
                k(g, !0);
                this.sliced = this.options.sliced = A(a) ? a : !this.sliced;
                c.options.data[m(this, c.data)] = this.options;
                this.graphic.animate(this.getTranslate());
                this.shadowGroup && this.shadowGroup.animate(this.getTranslate())
            }, getTranslate: function () {
                return this.sliced ? this.slicedTranslation : {translateX: 0, translateY: 0}
            }, haloPath: function (a) {
                var e = this.shapeArgs;
                return this.sliced || !this.visible ? [] : this.series.chart.renderer.symbols.arc(e.x, e.y, e.r + a, e.r + a, {
                    innerR: this.shapeArgs.r,
                    start: e.start,
                    end: e.end
                })
            }
        })
    })(K);
    (function (a) {
        var C = a.addEvent, A = a.arrayMax, G = a.defined, F = a.each, m = a.extend, g = a.format, k = a.map, q = a.merge, v = a.noop, u = a.pick, h = a.relativeLength, e = a.Series, n = a.seriesTypes, d = a.stableSort;
        a.distribute = function (a, e) {
            function b(a, b) {
                return a.target - b.target
            }

            var c, g = !0, h = a, l = [], m;
            m = 0;
            for (c = a.length; c--;)m += a[c].size;
            if (m > e) {
                d(a, function (a, b) {
                    return (b.rank || 0) - (a.rank || 0)
                });
                for (m = c = 0; m <= e;)m += a[c].size, c++;
                l = a.splice(c - 1, a.length)
            }
            d(a, b);
            for (a = k(a, function (a) {
                return {size: a.size, targets: [a.target]}
            }); g;) {
                for (c = a.length; c--;)g = a[c], m = (Math.min.apply(0, g.targets) + Math.max.apply(0, g.targets)) / 2, g.pos = Math.min(Math.max(0, m - g.size / 2), e - g.size);
                c = a.length;
                for (g = !1; c--;)0 < c && a[c - 1].pos + a[c - 1].size > a[c].pos && (a[c - 1].size += a[c].size, a[c - 1].targets = a[c - 1].targets.concat(a[c].targets), a[c - 1].pos + a[c - 1].size > e && (a[c - 1].pos = e - a[c - 1].size), a.splice(c, 1), g = !0)
            }
            c = 0;
            F(a, function (a) {
                var b =
                    0;
                F(a.targets, function () {
                    h[c].pos = a.pos + b;
                    b += h[c].size;
                    c++
                })
            });
            h.push.apply(h, l);
            d(h, b)
        };
        e.prototype.drawDataLabels = function () {
            var c = this, d = c.options, b = d.dataLabels, e = c.points, h, k, l = c.hasRendered || 0, m, r, n = u(b.defer, !!d.animation), v = c.chart.renderer;
            if (b.enabled || c._hasPointLabels)c.dlProcessOptions && c.dlProcessOptions(b), r = c.plotGroup("dataLabelsGroup", "data-labels", n && !l ? "hidden" : "visible", b.zIndex || 6), n && (r.attr({opacity: +l}), l || C(c, "afterAnimate", function () {
                c.visible && r.show(!0);
                r[d.animation ?
                    "animate" : "attr"]({opacity: 1}, {duration: 200})
            })), k = b, F(e, function (e) {
                var l, p = e.dataLabel, n, f, t = e.connector, w = !p, z;
                h = e.dlOptions || e.options && e.options.dataLabels;
                if (l = u(h && h.enabled, k.enabled) && null !== e.y)b = q(k, h), n = e.getLabelConfig(), m = b.format ? g(b.format, n) : b.formatter.call(n, b), z = b.style, n = b.rotation, z.color = u(b.color, z.color, c.color, "#000000"), "contrast" === z.color && (e.contrastColor = v.getContrast(e.color || c.color), z.color = b.inside || 0 > u(e.labelDistance, b.distance) || d.stacking ? e.contrastColor : "#000000"),
                d.cursor && (z.cursor = d.cursor), f = {
                    fill: b.backgroundColor,
                    stroke: b.borderColor,
                    "stroke-width": b.borderWidth,
                    r: b.borderRadius || 0,
                    rotation: n,
                    padding: b.padding,
                    zIndex: 1
                }, a.objectEach(f, function (a, b) {
                    void 0 === a && delete f[b]
                });
                !p || l && G(m) ? l && G(m) && (p ? f.text = m : (p = e.dataLabel = v[n ? "text" : "label"](m, 0, -9999, b.shape, null, null, b.useHTML, null, "data-label"), p.addClass("highcharts-data-label-color-" + e.colorIndex + " " + (b.className || "") + (b.useHTML ? "highcharts-tracker" : ""))), p.attr(f), p.css(z).shadow(b.shadow), p.added ||
                p.add(r), c.alignDataLabel(e, p, b, null, w)) : (e.dataLabel = p = p.destroy(), t && (e.connector = t.destroy()))
            })
        };
        e.prototype.alignDataLabel = function (a, d, b, e, g) {
            var c = this.chart, h = c.inverted, k = u(a.plotX, -9999), r = u(a.plotY, -9999), n = d.getBBox(), q, p = b.rotation, w = b.align, v = this.visible && (a.series.forceDL || c.isInsidePlot(k, Math.round(r), h) || e && c.isInsidePlot(k, h ? e.x + 1 : e.y + e.height - 1, h)), y = "justify" === u(b.overflow, "justify");
            if (v && (q = b.style.fontSize, q = c.renderer.fontMetrics(q, d).b, e = m({
                    x: h ? c.plotWidth - r : k, y: Math.round(h ?
                    c.plotHeight - k : r), width: 0, height: 0
                }, e), m(b, {
                    width: n.width,
                    height: n.height
                }), p ? (y = !1, k = c.renderer.rotCorr(q, p), k = {
                    x: e.x + b.x + e.width / 2 + k.x,
                    y: e.y + b.y + {top: 0, middle: .5, bottom: 1}[b.verticalAlign] * e.height
                }, d[g ? "attr" : "animate"](k).attr({align: w}), r = (p + 720) % 360, r = 180 < r && 360 > r, "left" === w ? k.y -= r ? n.height : 0 : "center" === w ? (k.x -= n.width / 2, k.y -= n.height / 2) : "right" === w && (k.x -= n.width, k.y -= r ? 0 : n.height)) : (d.align(b, null, e), k = d.alignAttr), y ? a.isLabelJustified = this.justifyDataLabel(d, b, k, n, e, g) : u(b.crop, !0) && (v = c.isInsidePlot(k.x,
                        k.y) && c.isInsidePlot(k.x + n.width, k.y + n.height)), b.shape && !p))d[g ? "attr" : "animate"]({
                anchorX: h ? c.plotWidth - a.plotY : a.plotX,
                anchorY: h ? c.plotHeight - a.plotX : a.plotY
            });
            v || (d.attr({y: -9999}), d.placed = !1)
        };
        e.prototype.justifyDataLabel = function (a, d, b, e, g, h) {
            var c = this.chart, k = d.align, m = d.verticalAlign, n, q, p = a.box ? 0 : a.padding || 0;
            n = b.x + p;
            0 > n && ("right" === k ? d.align = "left" : d.x = -n, q = !0);
            n = b.x + e.width - p;
            n > c.plotWidth && ("left" === k ? d.align = "right" : d.x = c.plotWidth - n, q = !0);
            n = b.y + p;
            0 > n && ("bottom" === m ? d.verticalAlign =
                "top" : d.y = -n, q = !0);
            n = b.y + e.height - p;
            n > c.plotHeight && ("top" === m ? d.verticalAlign = "bottom" : d.y = c.plotHeight - n, q = !0);
            q && (a.placed = !h, a.align(d, null, g));
            return q
        };
        n.pie && (n.pie.prototype.drawDataLabels = function () {
            var c = this, d = c.data, b, g = c.chart, h = c.options.dataLabels, k = u(h.connectorPadding, 10), l = u(h.connectorWidth, 1), m = g.plotWidth, r = g.plotHeight, n, q = c.center, p = q[2] / 2, v = q[1], C, L, f, t, K = [[], []], J, N, O, P, x = [0, 0, 0, 0];
            c.visible && (h.enabled || c._hasPointLabels) && (F(d, function (a) {
                a.dataLabel && a.visible && a.dataLabel.shortened &&
                (a.dataLabel.attr({width: "auto"}).css({
                    width: "auto",
                    textOverflow: "clip"
                }), a.dataLabel.shortened = !1)
            }), e.prototype.drawDataLabels.apply(c), F(d, function (a) {
                a.dataLabel && a.visible && (K[a.half].push(a), a.dataLabel._pos = null)
            }), F(K, function (d, e) {
                var l, n, u = d.length, w = [], z;
                if (u)for (c.sortByAngle(d, e - .5), 0 < c.maxLabelDistance && (l = Math.max(0, v - p - c.maxLabelDistance), n = Math.min(v + p + c.maxLabelDistance, g.plotHeight), F(d, function (a) {
                    0 < a.labelDistance && a.dataLabel && (a.top = Math.max(0, v - p - a.labelDistance), a.bottom =
                        Math.min(v + p + a.labelDistance, g.plotHeight), z = a.dataLabel.getBBox().height || 21, a.positionsIndex = w.push({
                            target: a.labelPos[1] - a.top + z / 2,
                            size: z,
                            rank: a.y
                        }) - 1)
                }), a.distribute(w, n + z - l)), P = 0; P < u; P++)b = d[P], n = b.positionsIndex, f = b.labelPos, C = b.dataLabel, O = !1 === b.visible ? "hidden" : "inherit", l = f[1], w && G(w[n]) ? void 0 === w[n].pos ? O = "hidden" : (t = w[n].size, N = b.top + w[n].pos) : N = l, delete b.positionIndex, J = h.justify ? q[0] + (e ? -1 : 1) * (p + b.labelDistance) : c.getX(N < b.top + 2 || N > b.bottom - 2 ? l : N, e, b), C._attr = {
                    visibility: O,
                    align: f[6]
                },
                    C._pos = {
                        x: J + h.x + ({left: k, right: -k}[f[6]] || 0),
                        y: N + h.y - 10
                    }, f.x = J, f.y = N, L = C.getBBox().width, l = null, J - L < k ? (l = Math.round(L - J + k), x[3] = Math.max(l, x[3])) : J + L > m - k && (l = Math.round(J + L - m + k), x[1] = Math.max(l, x[1])), 0 > N - t / 2 ? x[0] = Math.max(Math.round(-N + t / 2), x[0]) : N + t / 2 > r && (x[2] = Math.max(Math.round(N + t / 2 - r), x[2])), C.sideOverflow = l
            }), 0 === A(x) || this.verifyDataLabelOverflow(x)) && (this.placeDataLabels(), l && F(this.points, function (a) {
                var b;
                n = a.connector;
                if ((C = a.dataLabel) && C._pos && a.visible && 0 < a.labelDistance) {
                    O = C._attr.visibility;
                    if (b = !n)a.connector = n = g.renderer.path().addClass("highcharts-data-label-connector highcharts-color-" + a.colorIndex).add(c.dataLabelsGroup), n.attr({
                        "stroke-width": l,
                        stroke: h.connectorColor || a.color || "#e0faff"
                    });
                    n[b ? "attr" : "animate"]({d: c.connectorPath(a.labelPos)});
                    n.attr("visibility", O)
                } else n && (a.connector = n.destroy())
            }))
        }, n.pie.prototype.connectorPath = function (a) {
            var c = a.x, b = a.y;
            return u(this.options.dataLabels.softConnector, !0) ? ["M", c + ("left" === a[6] ? 5 : -5), b, "C", c, b, 2 * a[2] - a[4], 2 * a[3] - a[5], a[2],
                a[3], "L", a[4], a[5]] : ["M", c + ("left" === a[6] ? 5 : -5), b, "L", a[2], a[3], "L", a[4], a[5]]
        }, n.pie.prototype.placeDataLabels = function () {
            F(this.points, function (a) {
                var c = a.dataLabel;
                c && a.visible && ((a = c._pos) ? (c.sideOverflow && (c._attr.width = c.getBBox().width - c.sideOverflow, c.css({
                    width: c._attr.width + "px",
                    textOverflow: "ellipsis"
                }), c.shortened = !0), c.attr(c._attr), c[c.moved ? "animate" : "attr"](a), c.moved = !0) : c && c.attr({y: -9999}))
            }, this)
        }, n.pie.prototype.alignDataLabel = v, n.pie.prototype.verifyDataLabelOverflow = function (a) {
            var c =
                this.center, b = this.options, d = b.center, e = b.minSize || 80, g, l = null !== b.size;
            l || (null !== d[0] ? g = Math.max(c[2] - Math.max(a[1], a[3]), e) : (g = Math.max(c[2] - a[1] - a[3], e), c[0] += (a[3] - a[1]) / 2), null !== d[1] ? g = Math.max(Math.min(g, c[2] - Math.max(a[0], a[2])), e) : (g = Math.max(Math.min(g, c[2] - a[0] - a[2]), e), c[1] += (a[0] - a[2]) / 2), g < c[2] ? (c[2] = g, c[3] = Math.min(h(b.innerSize || 0, g), g), this.translate(c), this.drawDataLabels && this.drawDataLabels()) : l = !0);
            return l
        });
        n.column && (n.column.prototype.alignDataLabel = function (a, d, b, g, h) {
            var c =
                this.chart.inverted, l = a.series, k = a.dlBox || a.shapeArgs, m = u(a.below, a.plotY > u(this.translatedThreshold, l.yAxis.len)), n = u(b.inside, !!this.options.stacking);
            k && (g = q(k), 0 > g.y && (g.height += g.y, g.y = 0), k = g.y + g.height - l.yAxis.len, 0 < k && (g.height -= k), c && (g = {
                x: l.yAxis.len - g.y - g.height,
                y: l.xAxis.len - g.x - g.width,
                width: g.height,
                height: g.width
            }), n || (c ? (g.x += m ? 0 : g.width, g.width = 0) : (g.y += m ? g.height : 0, g.height = 0)));
            b.align = u(b.align, !c || n ? "center" : m ? "right" : "left");
            b.verticalAlign = u(b.verticalAlign, c || n ? "middle" : m ? "top" :
                "bottom");
            e.prototype.alignDataLabel.call(this, a, d, b, g, h);
            a.isLabelJustified && a.contrastColor && a.dataLabel.css({color: a.contrastColor})
        })
    })(K);
    (function (a) {
        var C = a.Chart, A = a.each, G = a.pick, F = a.addEvent;
        C.prototype.callbacks.push(function (a) {
            function g() {
                var g = [];
                A(a.series || [], function (a) {
                    var k = a.options.dataLabels, m = a.dataLabelCollections || ["dataLabel"];
                    (k.enabled || a._hasPointLabels) && !k.allowOverlap && a.visible && A(m, function (h) {
                        A(a.points, function (a) {
                            a[h] && (a[h].labelrank = G(a.labelrank, a.shapeArgs &&
                                a.shapeArgs.height), g.push(a[h]))
                        })
                    })
                });
                a.hideOverlappingLabels(g)
            }

            g();
            F(a, "redraw", g)
        });
        C.prototype.hideOverlappingLabels = function (a) {
            var g = a.length, k, m, v, u, h, e, n, d, c, w = function (a, c, d, e, g, h, k, m) {
                return !(g > a + d || g + k < a || h > c + e || h + m < c)
            };
            for (m = 0; m < g; m++)if (k = a[m])k.oldOpacity = k.opacity, k.newOpacity = 1;
            a.sort(function (a, c) {
                return (c.labelrank || 0) - (a.labelrank || 0)
            });
            for (m = 0; m < g; m++)for (v = a[m], k = m + 1; k < g; ++k)if (u = a[k], v && u && v !== u && v.placed && u.placed && 0 !== v.newOpacity && 0 !== u.newOpacity && (h = v.alignAttr, e = u.alignAttr,
                    n = v.parentGroup, d = u.parentGroup, c = 2 * (v.box ? 0 : v.padding), h = w(h.x + n.translateX, h.y + n.translateY, v.width - c, v.height - c, e.x + d.translateX, e.y + d.translateY, u.width - c, u.height - c)))(v.labelrank < u.labelrank ? v : u).newOpacity = 0;
            A(a, function (a) {
                var b, c;
                a && (c = a.newOpacity, a.oldOpacity !== c && a.placed && (c ? a.show(!0) : b = function () {
                    a.hide()
                }, a.alignAttr.opacity = c, a[a.isOld ? "animate" : "attr"](a.alignAttr, null, b)), a.isOld = !0)
            })
        }
    })(K);
    (function (a) {
        var C = a.addEvent, A = a.Chart, G = a.createElement, F = a.css, m = a.defaultOptions, g =
            a.defaultPlotOptions, k = a.each, q = a.extend, v = a.fireEvent, u = a.hasTouch, h = a.inArray, e = a.isObject, n = a.Legend, d = a.merge, c = a.pick, w = a.Point, b = a.Series, y = a.seriesTypes, D = a.svg, H;
        H = a.TrackerMixin = {
            drawTrackerPoint: function () {
                var a = this, b = a.chart.pointer, c = function (a) {
                    var c = b.getPointFromEvent(a);
                    void 0 !== c && (b.isDirectTouch = !0, c.onMouseOver(a))
                };
                k(a.points, function (a) {
                    a.graphic && (a.graphic.element.point = a);
                    a.dataLabel && (a.dataLabel.div ? a.dataLabel.div.point = a : a.dataLabel.element.point = a)
                });
                a._hasTracking ||
                (k(a.trackerGroups, function (d) {
                    if (a[d]) {
                        a[d].addClass("highcharts-tracker").on("mouseover", c).on("mouseout", function (a) {
                            b.onTrackerMouseOut(a)
                        });
                        if (u)a[d].on("touchstart", c);
                        a.options.cursor && a[d].css(F).css({cursor: a.options.cursor})
                    }
                }), a._hasTracking = !0)
            }, drawTrackerGraph: function () {
                var a = this, b = a.options, c = b.trackByArea, d = [].concat(c ? a.areaPath : a.graphPath), e = d.length, g = a.chart, h = g.pointer, m = g.renderer, n = g.options.tooltip.snap, f = a.tracker, q, v = function () {
                    if (g.hoverSeries !== a)a.onMouseOver()
                }, w =
                    "rgba(192,192,192," + (D ? .0001 : .002) + ")";
                if (e && !c)for (q = e + 1; q--;)"M" === d[q] && d.splice(q + 1, 0, d[q + 1] - n, d[q + 2], "L"), (q && "M" === d[q] || q === e) && d.splice(q, 0, "L", d[q - 2] + n, d[q - 1]);
                f ? f.attr({d: d}) : a.graph && (a.tracker = m.path(d).attr({
                    "stroke-linejoin": "round",
                    visibility: a.visible ? "visible" : "hidden",
                    stroke: w,
                    fill: c ? w : "none",
                    "stroke-width": a.graph.strokeWidth() + (c ? 0 : 2 * n),
                    zIndex: 2
                }).add(a.group), k([a.tracker, a.markerGroup], function (a) {
                    a.addClass("highcharts-tracker").on("mouseover", v).on("mouseout", function (a) {
                        h.onTrackerMouseOut(a)
                    });
                    b.cursor && a.css({cursor: b.cursor});
                    if (u)a.on("touchstart", v)
                }))
            }
        };
        y.column && (y.column.prototype.drawTracker = H.drawTrackerPoint);
        y.pie && (y.pie.prototype.drawTracker = H.drawTrackerPoint);
        y.scatter && (y.scatter.prototype.drawTracker = H.drawTrackerPoint);
        q(n.prototype, {
            setItemEvents: function (a, b, c) {
                var e = this, g = e.chart.renderer.boxWrapper, h = "highcharts-legend-" + (a.series ? "point" : "series") + "-active";
                (c ? b : a.legendGroup).on("mouseover", function () {
                    a.setState("hover");
                    g.addClass(h);
                    b.css(e.options.itemHoverStyle)
                }).on("mouseout",
                    function () {
                        b.css(d(a.visible ? e.itemStyle : e.itemHiddenStyle));
                        g.removeClass(h);
                        a.setState()
                    }).on("click", function (b) {
                    var c = function () {
                        a.setVisible && a.setVisible()
                    };
                    b = {browserEvent: b};
                    a.firePointEvent ? a.firePointEvent("legendItemClick", b, c) : v(a, "legendItemClick", b, c)
                })
            }, createCheckboxForItem: function (a) {
                a.checkbox = G("input", {
                    type: "checkbox",
                    checked: a.selected,
                    defaultChecked: a.selected
                }, this.options.itemCheckboxStyle, this.chart.container);
                C(a.checkbox, "click", function (b) {
                    v(a.series || a, "checkboxClick",
                        {checked: b.target.checked, item: a}, function () {
                            a.select()
                        })
                })
            }
        });
        m.legend.itemStyle.cursor = "pointer";
        q(A.prototype, {
            showResetZoom: function () {
                var a = this, b = m.lang, c = a.options.chart.resetZoomButton, d = c.theme, e = d.states, g = "chart" === c.relativeTo ? null : "plotBox";
                this.resetZoomButton = a.renderer.button(b.resetZoom, null, null, function () {
                    a.zoomOut()
                }, d, e && e.hover).attr({
                    align: c.position.align,
                    title: b.resetZoomTitle
                }).addClass("highcharts-reset-zoom").add().align(c.position, !1, g)
            }, zoomOut: function () {
                var a = this;
                v(a, "selection", {resetSelection: !0}, function () {
                    a.zoom()
                })
            }, zoom: function (a) {
                var b, d = this.pointer, g = !1, h;
                !a || a.resetSelection ? k(this.axes, function (a) {
                    b = a.zoom()
                }) : k(a.xAxis.concat(a.yAxis), function (a) {
                    var c = a.axis;
                    d[c.isXAxis ? "zoomX" : "zoomY"] && (b = c.zoom(a.min, a.max), c.displayBtn && (g = !0))
                });
                h = this.resetZoomButton;
                g && !h ? this.showResetZoom() : !g && e(h) && (this.resetZoomButton = h.destroy());
                b && this.redraw(c(this.options.chart.animation, a && a.animation, 100 > this.pointCount))
            }, pan: function (a, b) {
                var c = this, d = c.hoverPoints,
                    e;
                d && k(d, function (a) {
                    a.setState()
                });
                k("xy" === b ? [1, 0] : [1], function (b) {
                    b = c[b ? "xAxis" : "yAxis"][0];
                    var d = b.horiz, g = a[d ? "chartX" : "chartY"], d = d ? "mouseDownX" : "mouseDownY", h = c[d], f = (b.pointRange || 0) / 2, l = b.getExtremes(), k = b.toValue(h - g, !0) + f, f = b.toValue(h + b.len - g, !0) - f, m = f < k, h = m ? f : k, k = m ? k : f, f = Math.min(l.dataMin, b.toValue(b.toPixels(l.min) - b.minPixelPadding)), m = Math.max(l.dataMax, b.toValue(b.toPixels(l.max) + b.minPixelPadding)), n;
                    n = f - h;
                    0 < n && (k += n, h = f);
                    n = k - m;
                    0 < n && (k = m, h -= n);
                    b.series.length && h !== l.min && k !== l.max &&
                    (b.setExtremes(h, k, !1, !1, {trigger: "pan"}), e = !0);
                    c[d] = g
                });
                e && c.redraw(!1);
                F(c.container, {cursor: "move"})
            }
        });
        q(w.prototype, {
            select: function (a, b) {
                var d = this, e = d.series, g = e.chart;
                a = c(a, !d.selected);
                d.firePointEvent(a ? "select" : "unselect", {accumulate: b}, function () {
                    d.selected = d.options.selected = a;
                    e.options.data[h(d, e.data)] = d.options;
                    d.setState(a && "select");
                    b || k(g.getSelectedPoints(), function (a) {
                        a.selected && a !== d && (a.selected = a.options.selected = !1, e.options.data[h(a, e.data)] = a.options, a.setState(""), a.firePointEvent("unselect"))
                    })
                })
            },
            onMouseOver: function (a) {
                var b = this.series.chart, c = b.pointer;
                a = a ? c.normalize(a) : c.getChartCoordinatesFromPoint(this, b.inverted);
                c.runPointActions(a, this)
            }, onMouseOut: function () {
                var a = this.series.chart;
                this.firePointEvent("mouseOut");
                k(a.hoverPoints || [], function (a) {
                    a.setState()
                });
                a.hoverPoints = a.hoverPoint = null
            }, importEvents: function () {
                if (!this.hasImportedEvents) {
                    var b = this, c = d(b.series.options.point, b.options).events;
                    b.events = c;
                    a.objectEach(c, function (a, c) {
                        C(b, c, a)
                    });
                    this.hasImportedEvents = !0
                }
            }, setState: function (a,
                                   b) {
                var d = Math.floor(this.plotX), e = this.plotY, h = this.series, l = h.options.states[a] || {}, k = g[h.type].marker && h.options.marker, m = k && !1 === k.enabled, n = k && k.states && k.states[a] || {}, f = !1 === n.enabled, t = h.stateMarkerGraphic, u = this.marker || {}, v = h.chart, w = h.halo, y, B = k && h.markerAttribs;
                a = a || "";
                if (!(a === this.state && !b || this.selected && "select" !== a || !1 === l.enabled || a && (f || m && !1 === n.enabled) || a && u.states && u.states[a] && !1 === u.states[a].enabled)) {
                    B && (y = h.markerAttribs(this, a));
                    if (this.graphic)this.state && this.graphic.removeClass("highcharts-point-" +
                        this.state), a && this.graphic.addClass("highcharts-point-" + a), this.graphic.attr(h.pointAttribs(this, a)), y && this.graphic.animate(y, c(v.options.chart.animation, n.animation, k.animation)), t && t.hide(); else {
                        if (a && n) {
                            k = u.symbol || h.symbol;
                            t && t.currentSymbol !== k && (t = t.destroy());
                            if (t)t[b ? "animate" : "attr"]({
                                x: y.x,
                                y: y.y
                            }); else k && (h.stateMarkerGraphic = t = v.renderer.symbol(k, y.x, y.y, y.width, y.height).add(h.markerGroup), t.currentSymbol = k);
                            t && t.attr(h.pointAttribs(this, a))
                        }
                        t && (t[a && v.isInsidePlot(d, e, v.inverted) ?
                            "show" : "hide"](), t.element.point = this)
                    }
                    (d = l.halo) && d.size ? (w || (h.halo = w = v.renderer.path().add((this.graphic || t).parentGroup)), w[b ? "animate" : "attr"]({d: this.haloPath(d.size)}), w.attr({"class": "highcharts-halo highcharts-color-" + c(this.colorIndex, h.colorIndex)}), w.point = this, w.attr(q({
                        fill: this.color || h.color,
                        "fill-opacity": d.opacity,
                        zIndex: -1
                    }, d.attributes))) : w && w.point && w.point.haloPath && w.animate({d: w.point.haloPath(0)});
                    this.state = a
                }
            }, haloPath: function (a) {
                return this.series.chart.renderer.symbols.circle(Math.floor(this.plotX) -
                    a, this.plotY - a, 2 * a, 2 * a)
            }
        });
        q(b.prototype, {
            onMouseOver: function () {
                var a = this.chart, b = a.hoverSeries;
                if (b && b !== this)b.onMouseOut();
                this.options.events.mouseOver && v(this, "mouseOver");
                this.setState("hover");
                a.hoverSeries = this
            }, onMouseOut: function () {
                var a = this.options, b = this.chart, c = b.tooltip, d = b.hoverPoint;
                b.hoverSeries = null;
                if (d)d.onMouseOut();
                this && a.events.mouseOut && v(this, "mouseOut");
                !c || this.stickyTracking || c.shared && !this.noSharedTooltip || c.hide();
                this.setState()
            }, setState: function (a) {
                var b = this,
                    d = b.options, e = b.graph, g = d.states, h = d.lineWidth, d = 0;
                a = a || "";
                if (b.state !== a && (k([b.group, b.markerGroup, b.dataLabelsGroup], function (c) {
                        c && (b.state && c.removeClass("highcharts-series-" + b.state), a && c.addClass("highcharts-series-" + a))
                    }), b.state = a, !g[a] || !1 !== g[a].enabled) && (a && (h = g[a].lineWidth || h + (g[a].lineWidthPlus || 0)), e && !e.dashstyle))for (h = {"stroke-width": h}, e.animate(h, c(b.chart.options.chart.animation, g[a] && g[a].animation)); b["zone-graph-" + d];)b["zone-graph-" + d].attr(h), d += 1
            }, setVisible: function (a,
                                     b) {
                var c = this, d = c.chart, e = c.legendItem, g, h = d.options.chart.ignoreHiddenSeries, l = c.visible;
                g = (c.visible = a = c.options.visible = c.userOptions.visible = void 0 === a ? !l : a) ? "show" : "hide";
                k(["group", "dataLabelsGroup", "markerGroup", "tracker", "tt"], function (a) {
                    if (c[a])c[a][g]()
                });
                if (d.hoverSeries === c || (d.hoverPoint && d.hoverPoint.series) === c)c.onMouseOut();
                e && d.legend.colorizeItem(c, a);
                c.isDirty = !0;
                c.options.stacking && k(d.series, function (a) {
                    a.options.stacking && a.visible && (a.isDirty = !0)
                });
                k(c.linkedSeries, function (b) {
                    b.setVisible(a,
                        !1)
                });
                h && (d.isDirtyBox = !0);
                !1 !== b && d.redraw();
                v(c, g)
            }, show: function () {
                this.setVisible(!0)
            }, hide: function () {
                this.setVisible(!1)
            }, select: function (a) {
                this.selected = a = void 0 === a ? !this.selected : a;
                this.checkbox && (this.checkbox.checked = a);
                v(this, a ? "select" : "unselect")
            }, drawTracker: H.drawTrackerGraph
        })
    })(K);
    (function (a) {
        var C = a.Chart, A = a.each, G = a.inArray, F = a.isArray, m = a.isObject, g = a.pick, k = a.splat;
        C.prototype.setResponsive = function (g) {
            var k = this.options.responsive, m = [], h = this.currentResponsive;
            k && k.rules &&
            A(k.rules, function (e) {
                void 0 === e._id && (e._id = a.uniqueKey());
                this.matchResponsiveRule(e, m, g)
            }, this);
            var e = a.merge.apply(0, a.map(m, function (e) {
                return a.find(k.rules, function (a) {
                    return a._id === e
                }).chartOptions
            })), m = m.toString() || void 0;
            m !== (h && h.ruleIds) && (h && this.update(h.undoOptions, g), m ? (this.currentResponsive = {
                ruleIds: m,
                mergedOptions: e,
                undoOptions: this.currentOptions(e)
            }, this.update(e, g)) : this.currentResponsive = void 0)
        };
        C.prototype.matchResponsiveRule = function (a, k) {
            var m = a.condition;
            (m.callback ||
            function () {
                return this.chartWidth <= g(m.maxWidth, Number.MAX_VALUE) && this.chartHeight <= g(m.maxHeight, Number.MAX_VALUE) && this.chartWidth >= g(m.minWidth, 0) && this.chartHeight >= g(m.minHeight, 0)
            }).call(this) && k.push(a._id)
        };
        C.prototype.currentOptions = function (g) {
            function q(g, e, n, d) {
                var c;
                a.objectEach(g, function (a, b) {
                    if (!d && -1 < G(b, ["series", "xAxis", "yAxis"]))for (g[b] = k(g[b]), n[b] = [], c = 0; c < g[b].length; c++)e[b][c] && (n[b][c] = {}, q(a[c], e[b][c], n[b][c], d + 1)); else m(a) ? (n[b] = F(a) ? [] : {}, q(a, e[b] || {}, n[b], d + 1)) : n[b] =
                        e[b] || null
                })
            }

            var u = {};
            q(g, this.options, u, 0);
            return u
        }
    })(K);
    return K
});
